【动态规划】货币面值
时间限制: 1 Sec 内存限制: 64 MB题目描述
魔法世界发行了很多不同面值的纸币,试求出用这些纸币进行任意的组合不能表示的最小面值是多少。
输入
输入包含多个测试用例,每组测试用例的第一行输入一个整数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
分析:相当于简单0-1背包问题恰好凑够j元
#include <iostream> #define INF 0x3f3f3f3f using namespace std; int m,a[111],f[11111]; void OneZeroPack(int m,int v,int w) { for(int i=m;i>=v;i--) f[i]=max(f[i],f[i-v]+w); } int main() { while(cin>>m) { for(int i=0;i<m;i++) cin>>a[i]; for(int i=1;i<m*100+1;i++) f[i]=-INF; f[0]=0; for(int i=0;i<m;i++) OneZeroPack(m*100,a[i],a[i]); for(int i=0;i<m*100+1;i++) { if(f[i]<0) { cout<<i<<endl; break; } } } return 0; }