這道題我剛開始做的時候就覺得是完全揹包,每種無限個,且每個都有它的價值,要求在目標價值下求揹包中裝的個數最小(當然完全揹包原型是求得最大,不過都一樣)。下面直接上這個方法的代碼,算是板子吧:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int Max = amount + 1;
vector<int> dp(amount + 1, Max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.size(); j++) {
if (coins[j] <= i) {
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount? -1: dp[amount];
}
};
當然了,這種“選數”問題,我們也可以DFS來做,(我剛學會搜索的時候感覺萬物皆可搜索。。啊哈哈哈哈)。不過直接爆搜的話肯定會超時,所以還需要用到一個備忘錄來剪枝,下面上一個大佬的代碼:
class Solution {
int ans=Integer.MAX_VALUE;
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
dfs(coins,coins.length-1,amount,0);
return ans==Integer.MAX_VALUE?-1:ans;
}
public void dfs(int[] coins,int index,int amount,int cnt){
if(index<0){
return;
}
for(int c=amount/coins[index];c>=0;c--){
int na=amount-c*coins[index];
int ncnt=cnt+c;
if(na==0){
ans=Math.min(ans,ncnt);
break;//剪枝1
}
if(ncnt+1>=ans){
break; //剪枝2
}
dfs(coins,index-1,na,ncnt);
}
}
}
作者:iejepwy
鏈接:https://leetcode-cn.com/problems/coin-change/solution/dfsjian-zhi-2ms-ji-bai-100bi-dphuan-kuai-by-iejepw/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。