0-1 背包问题:给定 total 种物品和一个容量为 weight 的背包,物品 i 的重量是 W,其价值为 V 。
问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?
#include <iostream>
#include <cstring>
using namespace std;
const int MAX=1005;
int V[MAX],W[MAX],dp[MAX][MAX]; //V价值 , W重量
int main()
{
int total,weight; //组数,背包容量
cin>>total>>weight;
for(int i=1;i<=total;i++)
{
cin>>V[i];
}
for(int i=1;i<=total;i++) //这里i=0或1一定要与下面的for循环对应!!!!!!!
{
cin>>W[i];
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=total;i++) //遍历
{
for(int j=1;j<=weight;j++) //不超过背包容量
{
if(j<W[i]) //装不下
{
dp[i][j]=dp[i-1][j];
}
else //比较与之前的最优解谁大谁小
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-W[i]]+V[i]);
}
}
}
cout<<dp[total][weight]<<endl; //从1开始,所以这里不减1
return 0;
}