开始看到题目感觉不是很好做,抱着试试的态度用递推的方法写了一个程序,没想到居然过了。。。。
用f[i]表示大小i能否取到,则 f[i] = f[i] || f[i-a[k]], 1<=k<=n
推到一个较大的数N,如果每个数都能取到或者较大的数内(接近N)存在不能取到的数,则输出0,否则输出不能取到的最大值
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- /*
- PROG: nuggets
- LANG: C++
- ID: heben991
- */
- const int N = 1000010;
- bool f[N];
- int a[20];
- int main()
- {
- freopen("nuggets.in", "r", stdin);
- freopen("nuggets.out","w",stdout);
- int n, i, j, ans, sum=0;
- scanf("%d", &n);
- for(i = 1; i <= n; ++i)
- {
- scanf("%d",a+i);
- sum += a[i];
- }
- f[0] = 1;
- for(i = 1; i < N; ++i)
- {
- for(j = 1; !f[i] && j <= n; ++j)
- if(a[j]<=i)
- {
- f[i] = f[i-a[j]];
- }
- if(!f[i]) ans = i;
- }
- for(i = N-sum-1; i < N; ++i)
- if(!f[i])
- {
- puts("0");
- return 0;
- }
- for(i = 1; i < N; ++i) if(!f[i])break;
- if(i==N) puts("0");
- else printf("%d/n", ans);
- return 0;
- }
888

被折叠的 条评论
为什么被折叠?



