題意:幾種無限數量的硬幣,湊成amount的方案數,方案是無序的,即1+2 和 2+1算同一種
題解:方法一:經典揹包解法
dp[i][j]表示前i個物品湊出j的方案數,考慮第i個選與不選兩種情況,其中選的時候,再考慮選擇第i個物品的次數。
class solution }}
return dp[n][amount];
}};
方法二:刷表法
拿每個硬幣刷一次表,對於1 2 3 5,相當於先只選1,再只選1 2,再只選1 2 3,這樣就不用考慮順序問題。其次,需要從左往右刷,例如列舉2的時候,dp[i-2]已經可能被2重新整理過了,dp[i]+=dp[i-2]就行,不需要考慮選多次2,像dp[i]=1+1+2+2+2+2已經被dp[i-2]考慮了
總之,這種方法即限制了順序,又不用手動列舉coins[i]的次數
class solution
}return dp[amount];
}};
注意。這裡有乙個常見的問題,我可以將i和j兩個迴圈交換順序嗎?不能,交換後相當於,先選一次1 2 3 5,這樣選擇100次,顯然沒有考慮順序問題,有大量重複
但是,有時候是可以交換的,也就是與方案的順序無關時,例如求最小的方案數(即最少的硬幣數),例如 lc691. 貼紙拼詞
leetcode的揹包問題
有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。定義陣列 dp i j 代表前i個商品,放入乙個容量為j的揹包,所獲得的最大價值初始化 如果要求恰好放滿揹包,則陣列初始化為 inf dp inf amount 1 for in range...
Leetcode 0 1揹包問題
什麼是揹包問題?比如有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?0 1揹包問題就是這n個物品中某乙個物品選還是不選,分別表示1和0 題目描述 比如有n個物品,它們有各自的體積w和價值v,現有給定容量的揹包ba 如何讓揹包裡裝入的物品具有最大的價值...
揹包問題 01揹包問題
n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...