void solve(){ for(int i=1;i<=n;++i){ ///n是物品个数 int k; for(k=1;k*2<c[i]+1;k<<=1) ///c[i]是第 i 个物品的个数 for(int j=sum;j>=k*w[i];--j) ///w[i] 是第 i 个物品的重量 dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]); ///v[i] 是第 i 个物品价值 k=c[i]+1-k; for(int j=sum;j>=k*w[i];--j) dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]); } }