[usaco3.1.2]inflate
一开始想把他们分成一件件来做01背包(是在下输了),然后发现直接来一个完全背包就可以了(严重打击自信心),然后再来一个大牛的实用优化(但貌似我写得很拙),看来我还是太年轻了。
/* ID:abc31261 LANG:C++ TASK:inflate */ #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=11111; long long w[maxn],v[maxn],f[maxn]; int main() { int maxw=0,minv=0x7f,i,j,n,m,l,len=0; freopen("inflate.in","r",stdin); freopen("inflate.out","w",stdout); scanf("%d%d",&n,&m); for (i=1;i<=m;i++) { ++len; scanf("%d%d",&w[len],&v[len]); if (w[len]>maxw && v[len]<minv){ maxw=w[len]; minv=v[len];} else if (w[len]<=maxw && v[len]>=minv)len--; } memset(f,0,sizeof(f)); for (i=1;i<=len;i++) for (j=v[i];j<=n;j++)f[j]=max(f[j],f[j-v[i]]+w[i]); printf("%d\n",f[n]); return 0; }