【动态规划】货币面值
问题 D: 【动态规划】货币面值
时间限制: 1 Sec 内存限制: 64 MB提交: 16 解决: 14
[提交][状态][讨论版]
题目描述
魔法世界发行了很多不同面值的纸币,试求出用这些纸币进行任意的组合不能表示的最小面值是多少。
输入
输入包含多个测试用例,每组测试用例的第一行输入一个整数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> #include <cstdio> #include <cstring> using namespace std; int a[10005]; void zeroonepack(int T,int t,int p){//总容量,单件物品消耗,单件价值 for(int i=T;i>=t;i--){ a[i]=max(a[i],a[i-t]+p); } } int main() { int n; int sum=0; int w[105]; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&w[i]); sum+=w[i]; } for(int i=0;i<sum;i++){ a[i]=-999999; } a[0]=0; for(int j=0;j<n;j++){ zeroonepack(sum,w[j],w[j]); } for(int i=0;i<sum;i++){ if(a[i]<0){ printf("%d\n",i); break; } } } return 0; }