暑假算法7.29,Day28
完全背包
第一题
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1);
dp[0]=0;
for(int i=1;i<amount+1;i++){
dp[i]=amount+1;
}
for(int i=1;i<=amount;i++){
for(auto x:coins){
if(i-x<0)continue;
dp[i]=min(dp[i],1+dp[i-x]);
}
}
return dp[amount]==amount+1 ? -1:dp[amount];
}
};
第二题
class Solution {
public int change(int amount, int[] coins) {
int len = coins.length;
if (amount < 0 || len <= 0) return 0;
// dp[i]表示凑成面额为i的最大组合数
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int i = 0; i < len; i++) {
// 顺序遍历,可重复选
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
}
第三题
class Solution {
public String largestNumber(int[] cost, int target) {
String[] dp = new String[target+1];
for(int i=0;i<dp.length;i++){
dp[i] = "";
}
//必须恰好等于
for(int i=0;i<cost.length;i++){
for(int j=cost[i];j<=target;j++){
if(j-cost[i]!=0&&dp[j-cost[i]].length()==0)
continue;
if(dp[j].length()<=dp[j-cost[i]].length()+1){
dp[j] = (i+1)+dp[j-cost[i]];
}
}
}
if(dp[target].length()==0) return "0";
return dp[target];
}
}