Coin Change
问题描述:
给定一些货币的面额,如coins=[1,5,6,8];假定每种货币有无数个;
再给定总共金额,如total=11;
求最少需要多少个货币能够得到total的总额。
核心思想:
if(j>=coins[i])
T[i][j] = min(T[i-1][j], T[i][j-coins[i]]]);
else
T[i][j] = T[i-1][j];
本题代码:
int coinChange(vector<int>& coins, int amount) {
if (amount==0) {
return 0;
}
else if(coins.size()==0){
return -1;
}
else{
vector<int>::iterator it = coins.begin(); //防止给的货币数组不是递增的
sort(it, it+coins.size()); //注意:vector<int>的排序方法,是用iterator,而不是直接用变量名。
int row_len = coins.size();
int col_len = amount+1;
vector<vector<int> > dp(row_len, vector<int>(col_len, 0));
for (int i=1; i<col_len; i++) {
if (i%coins[0]==0) {
int t = i/coins[0];
dp[0][i] = t;
}
else
dp[0][i] = -1;
}
for (int i=1; i<row_len; i++) {
for (int j=1; j<col_len; j++) {
if (j>=coins[i]) {
if (dp[i-1][j]==-1&&dp[i][j-coins[i]]==-1) { //当无论是否包含coins[i]都无法达到时,则置 -1;
dp[i][j] = -1;
}
else if(dp[i-1][j]==-1){dp[i][j] = dp[i][j-coins[i]]+1;} //当不包含不能达到,包含能够达到;则按照包含计算。
else if(dp[i][j-coins[i]]==-1){dp[i][j] = dp[i-1][j];} //当包含不能达到,不包含能够达到;则按照不包含计算。
else{dp[i][j] = min(dp[i][j-coins[i]]+1, dp[i-1][j]);} //核心步骤:当是否包含都能达到,选取小的值。
}
else
dp[i][j] = dp[i-1][j]; //当conins[i]>j时,说明肯定不包含conins[i].
}
}
return dp[row_len-1][col_len-1];
}
}