1 //01背包 价值等于体积 2 //该题卡常 优化:当价值(体积)已超过背包容积时直接输出背包容积 3 #include<bits/stdc++.h> 4 using namespace std; 5 const int maxn=5005; 6 const int maxv=50005; 7 int c,n,v[maxn],f[maxv]; 8 int main() 9 { 10 scanf("%d%d",&c,&n); 11 for(int i=1;i<=n;++i) scanf("%d",&v[i]); 12 for(int i=1;i<=n;++i) 13 for(int j=c;j>=v[i];--j) 14 { 15 f[j]=max(f[j],f[j-v[i]]+v[i]); 16 if(f[j]>=c) {printf("%d",c);return 0;} 17 } 18 printf("%d",f[c]); 19 return 0; 20 }