usaco 4.1 Beef McNuggets 搜索

 开始看到题目感觉不是很好做,抱着试试的态度用递推的方法写了一个程序,没想到居然过了。。。。

用f[i]表示大小i能否取到,则 f[i] = f[i] || f[i-a[k]],  1<=k<=n

 

推到一个较大的数N,如果每个数都能取到或者较大的数内(接近N)存在不能取到的数,则输出0,否则输出不能取到的最大值

 

 

  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;
  5. /*
  6. PROG: nuggets
  7. LANG: C++
  8. ID: heben991
  9. */
  10. const int N = 1000010;
  11. bool f[N];
  12. int a[20];
  13. int main()
  14. {
  15.     freopen("nuggets.in""r", stdin);
  16.     freopen("nuggets.out","w",stdout);
  17.     int n, i, j, ans, sum=0;
  18.     scanf("%d", &n);
  19.     for(i = 1; i <= n; ++i)
  20.     {
  21.         scanf("%d",a+i);
  22.         sum += a[i];
  23.     }
  24.     f[0] = 1;
  25.     for(i = 1; i < N; ++i)
  26.     {
  27.         for(j = 1; !f[i] && j <= n; ++j)
  28.         if(a[j]<=i)
  29.         {
  30.             f[i] = f[i-a[j]];
  31.         }
  32.         if(!f[i]) ans = i;
  33.     }
  34.     for(i = N-sum-1; i < N; ++i)
  35.     if(!f[i])
  36.     {
  37.         puts("0");
  38.         return 0;
  39.     }
  40.     for(i = 1; i < N; ++i) if(!f[i])break;
  41.     if(i==N) puts("0");
  42.     else printf("%d/n", ans);
  43.     return 0;
  44. }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值