USACO Section 3.1 Stamps - 表示很Eggache!!!看清题目才是根本..

来源:互联网 发布:约会 知乎 编辑:程序博客网 时间:2024/06/05 19:05

  题目很简单...就是多重背包的思想...保证每个空间尽量能凑出并且所需的数字最小...

   问题就是!!!这个背包的大小...必须要注意阿~~2000000基本是要严格的...大一点爆空间...小一点错结果...我开始就是犯傻..开空间各种2...后来再看了下题目才过的...

Program:

/*  ID: zzyzzy12  LANG: C++  TASK: stamps*/    #include<iostream>    #include<istream>#include<stdio.h>    #include<string.h>    #include<math.h>    #include<stack>#include<algorithm>    #include<queue> #define oo 2000000000#define ll long longusing namespace std;     int k,n,x,i,w[2505050],num;int main(){     freopen("stamps.in","r",stdin);       freopen("stamps.out","w",stdout);        memset(w,-1,sizeof(w));      w[0]=0;  num=0;     scanf("%d%d",&k,&n);     while (n--)     {           scanf("%d",&x);             for (i=0;i<=num;i++)           if (w[i]>=0 && w[i]<=k && (w[i+x]==-1 || w[i]+1<w[i+x]) && i+x<=2000000)            {                 w[i+x]=w[i]+1;                 if (i+x>num) num=i+x;           }     }      for (i=1;i<=num;i++)       if (w[i]==-1 || w[i]>k) break;     printf("%d\n",i-1);     return 0;   }