【发布时间】:2021-11-30 23:56:07
【问题描述】:
考虑一个由 n 个硬币组成的货币系统。每个硬币都有一个正整数值。你的任务是计算可以使用可用硬币产生货币总和 x 的不同有序方式的数量。
例如,如果硬币是 {2,3,5} 并且期望的总和是 9,则有 3 种方式:
2+2+5 3+3+3 2+2+2+3
我正在尝试为此编写递归解决方案。
我想出了this 代码。
#include<iostream>
#include<vector>
using namespace std;
#define M 1000000007
vector<int>arr;
vector<vector<int>>dp;
int solve(int i,int target){
if(i>=(int)arr.size()) return 0;
if(target<0) return 0;
if(target==0) return 1;
if(dp[i][target]!=-1) return dp[i][target];
return dp[i][target]=(solve(i,target-arr[i])%M+solve(i+1,target)%M)%M;
}
int main(){
int n,target;
cin>>n>>target;
arr.resize(n);
dp.resize(n+1,vector<int>(target+1,-1));
for(int i=0;i<n;++i){
cin>>arr[i];
}
cout<<solve(0,target);
}
但此代码超出了时间限制。如何以递归方式编写此代码以使其被接受?这是non-recursive approach,但我想知道如何编写它的递归版本。
【问题讨论】:
-
链接解决方案使用一维
dp,而您使用二维向量...
标签: c++ algorithm dynamic-programming