1. 程式人生 > >【動態規劃】貨幣面值

【動態規劃】貨幣面值

用例 數字 一行 元素 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 namespace
std; 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了

【動態規劃】貨幣面值