问题 L: 【动态规划】货币面值
时间限制: 1 Sec 内存限制: 64 MB提交: 115 解决: 43
[提交] [状态] [讨论版] [命题人:]
题目描述
魔法世界发行了很多不同面值的纸币,试求出用这些纸币进行任意的组合不能表示的最小面值是多少。
输入
输入包含多个测试用例,每组测试用例的第一行输入一个整数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
分析:01背包,凑够j元即可。#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,a[105],dp[10005]; void init(){ } void solve(){ while(cin>>n){ range(i,0,n-1)cin>>a[i]; range(i,1,n*100)dp[i]=-0x7f7f7f7f; dp[0]=0; range(i,0,n-1) rerange(j,n*100,a[i])dp[j]=max(dp[j],dp[j-a[i]]+a[i]); range(i,0,n*100-1)if(dp[i]<0){ cout<<i<<endl; break; } } } int main() { init(); solve(); return 0; }