给定arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数。
和上一题的转移来的状态完全相同。
转移方程改为:
dp[i][j]=dp[i-1][j]+dp[i][j-arr[i]]
package DP;
public class Coin {
public int getMeansCnt(int arr[],int aim){
int[] dp=new int[aim+1];
//initial
for(int j=0;j<=aim;++j) {
dp[j]=0;
}
for(int j=0,k=0;j*k<=aim;++k) {
if(j==0) {
dp[j]=1;
}
else if(j*k==arr[0]) {
dp[j*k]=1;
}
}
for(int i=0;i<arr.length;++i) {
for(int j=arr[i];j<=aim;++j) {
dp[j]=dp[j]+dp[j-arr[i]];
}
}
return dp[aim];
}
}
原文:https://www.cnblogs.com/coding-gaga/p/10847373.html