【動態規劃】貨幣面值
阿新 • • 發佈:2018-08-05
用例 數字 一行 元素 sample ont con 包含 flag
題目描述
魔法世界發行了很多不同面值的紙幣,試求出用這些紙幣進行任意的組合不能表示的最小面值是多少。
輸入
輸入包含多個測試用例,每組測試用例的第一行輸入一個整數N(N≤100)表示流通的紙幣面額數量,第二行是N個紙幣的具體表示面額,取值範圍為1~100。
輸出
對於每組測試用例,輸出一個整數,表示已經發行的所有紙幣都不能表示的最小面值(已經發行的每個紙幣面值最多只能使用一次,但面值可能有重復)。
樣例輸入
5
1 2 3 9 100
5
1 2 4 9 100
5
1 2 4 7 100
樣例輸出
7 8 15
#include<iostream> using namespacestd; int main() { int n; while(cin>>n) { int a[105]={0}; int sum = 0; for(int i=0;i<n;i++) { cin>>a[i]; sum += a[i]; } int dp[10005]={0}; for(int i=0;i<n;i++) { for(int j=sum;j>=a[i];j--) { dp[j]= max(dp[j],dp[j-a[i]]+a[i]); } } int flag = 0; for(int i=1;i<=sum;i++) { if(dp[i]!=i) { flag = 1; cout<<i<<endl; break; } } if(!flag) //********cout<<sum+1<<endl; } return 0; }
一道變向0/1背包問題
給你幾個數 問你不能組合成的最小的數,組合成一個數,面對其中一個元素 無非就是選與不選 ,而01背包中dp[i]表示背包為i大小的時候 最大能裝的價值
我們這道題dp[i]表示的是這個背包能組合成的最大的數,這個數不會超過i的大小,所以如果dp[i]==i則說明能夠組合成這個數字。那麽,如果dp[i]!=i的話
就是無法組成這個數。
將i從1到sum遍歷一次 就能找到最小的 無法組合的數
註意:打*的代碼容易忽略 我就wa了一發 如果從1到sum都能組成 那麽最小不能組成的數就是sum+1了
【動態規劃】貨幣面值