标签:
一开始想把他们分成一件件来做01背包(是在下输了),然后发现直接来一个完全背包就可以了(严重打击自信心),然后再来一个大牛的实用优化(但貌似我写得很拙),看来我还是太年轻了。
1 /* 2 ID:abc31261 3 LANG:C++ 4 TASK:inflate 5 */ 6 #include<cstdio> 7 #include<cstring> 8 #include<iostream> 9 using namespace std; 10 const int maxn=11111; 11 long long w[maxn],v[maxn],f[maxn]; 12 int main() 13 { 14 int maxw=0,minv=0x7f,i,j,n,m,l,len=0; 15 freopen("inflate.in","r",stdin); 16 freopen("inflate.out","w",stdout); 17 scanf("%d%d",&n,&m); 18 for (i=1;i<=m;i++) 19 { 20 ++len; 21 scanf("%d%d",&w[len],&v[len]); 22 if (w[len]>maxw && v[len]<minv){ maxw=w[len]; minv=v[len];} 23 else if (w[len]<=maxw && v[len]>=minv)len--; 24 } 25 memset(f,0,sizeof(f)); 26 for (i=1;i<=len;i++) 27 for (j=v[i];j<=n;j++)f[j]=max(f[j],f[j-v[i]]+w[i]); 28 printf("%d\n",f[n]); 29 return 0; 30 }
标签:
原文地址:http://www.cnblogs.com/Sun-Sea/p/5008760.html