定义一种新货币,有n(n<=50)种不同的币值,其中币值为 value(value<=50) 的有 w(w<=20) 个。现在你有 x(x<=100) 元,但是你想将 x 元换成若干零钱,请问有多少种换钱的方案?
2,10,[[1, 5],[ 2, 4]]
2
10元可以由 2张1元的和4张2元的组成,也可以由4张1元的和3张2元的组成
x可以不属于n种币值之一
class Solution { public: int solve(int n, int x, vector<vector<int> >& a) { int dp[n+1][x+1]; for(int i =0;i<=n;++i){ for(int j=0;j<=x;++j) dp[i][j]=0; } dp[0][0]=1; for(int i=1; i<=n;++i){ for(int j=0;j<=x;++j){ for(int k=0;k<=a[i-1][1];++k){ if(dp[i-1][j]>0 && j+k*a[i-1][0]<=x) dp[i][j+k*a[i-1][0]]+=dp[i-1][j]; } } } return dp[n][x]; } };上面是c++,下面是python
class Solution: def solve(self , n , x , a ): dp=[[0 for i in range(x+1)] for j in range(n+1)] dp[0][0]=1 for i in range(1,n+1): for j in range(x+1): for k in range(a[i-1][1]+1): if dp[i-1][j]>0 and j+k*a[i-1][0]<=x: dp[i][j+k*a[i-1][0]]+=dp[i-1][j] return dp[n][x]
int solve(int n, int x, vector<vector<int> >& a) { int f[101]={1}; for(int i=0;i<n;i++) { int money=a[i][0]; for(int j=x;j>=1;j--) { for(int k=1;k<=a[i][1];k++) { if(j<money*k) break; f[j]+=f[j-money*k]; } } } return f[x]; }
class Solution { public: /** * * @param n int整型 :牛币值种类数 * @param x int整型 :牛妹拥有的钱数 * @param a int整型vector<vector<>> :第二个vector中的第一列表示币值,第二列表示牛牛拥有币值的个数 * @return int整型 */ int solve(int n, int x, vector<vector<int> >& a) { int dp[n+1][x+1]; memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i=0;i<n;i++) for(int j=0;j<=x;j++) for(int k=0;k<=a[i][1];k++) if(j+k*a[i][0] <= x) dp[i+1][j+k*a[i][0]] += dp[i][j]; return dp[n][x]; } };
class Solution: def solve(self, n, x, a): # 定义状态、开数组、同时定义了res[0]=1的边界条件 res = [1] + [0] * x # 开始循环、储值、注意数组越界问题 for i in range(n): for j in range(x, -1, -1): for k in range(1, a[i][1] + 1): if j + k * a[i][0] > x&nbs***bsp;res[j] == 0: break res[j + k * a[i][0]] += res[j] return res[x]
class Solution: def solve(self , n , x , a ): # write code here res = [0]*(x+1) res[0] = 1 for value,nums in a: for idx in range(len(res)-1,-1,-1): if res[idx]!=0: for j in range(nums): now = idx+(j+1)*value if now >= len(res): break res[now] += res[idx] return res[-1]