看来以后做题务必要看清题意,这道题的意思就是背包可以不用装满,而我非要按照装满的情况来处理,WA了两次
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int N,M,W[3405],D[3405],V[12885];
int main()
{
int i,j;
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
scanf("%d %d",&W[i],&D[i]);
for(i=1;i<=N;i++)
for(j=M;j>=W[i];j--)//要保留第i个物品到来时前i-1个物品在背包中的
V[j]=max(V[j],V[j-W[i]]+D[i]); //状态,所以必须要逆序
printf("%d\n",V[M]);
system("pause");
return 0;
}
本文通过一道背包问题实例,详细解析了如何正确理解题意并实现背包问题的解决算法。重点介绍了在处理背包问题时,如何避免常见的陷阱,比如不必将背包完全装满。文章通过具体的代码示例展示了正确的实现方式。
889

被折叠的 条评论
为什么被折叠?



