<center>

问题 D: 【动态规划】货币面值

时间限制: 1 Sec  内存限制: 64 MB
提交: 16  解决: 14
[提交][状态][讨论版]
</center>

题目描述

魔法世界发行了很多不同面值的纸币,试求出用这些纸币进行任意的组合不能表示的最小面值是多少。

输入

输入包含多个测试用例,每组测试用例的第一行输入一个整数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;
}