原因:01背包发f[i][v]是根据状态发f[i-1][v-c[i]]递推过来的,而现在完全背包每件物品可选无限件,所以在考虑“加选一件第i种物品”的策略时,却正需要已选入第i个物品子结果发f[i][v-c[i]]。 简单优化: 1)若两件物品i、j满足c[i]<=c[j] 并且w[i]>=w[j],则将物品j去掉,不用考虑 . 2)将费用大于V的
int n,v,w,c,dp[1010];//dp[i]表示装入物品的质量为i时能获得的最大价值 int main() { cin>>v>>n;//v为背包容量,n为物品数量 for(int i=1;i<=n;i++) { cin>>w>>c;//w为每个物品重量,c为每个物品价值 for(int j=v;j>=w;j--)//背包容量从大到小遍历 dp[j]=max(dp[j],dp[...