#include<iostream>
#include<string.h>
using namespace std;
int n,v;
int cost[10000],value[10000];
int dp[10000];
int main()
{
while(cin>>n>>v)//n为物品数量,v为背包大小
{
memset(dp,0,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
cin>>cost[i]>>value[i];//cost为占背包大小,value为物品价值
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=v;j>=cost[i];j--)//01package,如果是从cost[i]到v循环,
{ //就变成了完全背包,就是每个物品可以取多个,而不是只能取一个
dp[j]=max(dp[j],dp[j-cost[i]]+value[i]);
}
}
cout<<dp[v]<<endl;//输出背包容量v所能容纳的物品最大价值
//如果想要求出必须把背包装满的最大价值,可以把dp数组全部初始化为-∞
}
return 0;
}
/*
5 150
50 100
40 200
55 300
5 30
20 30
*/
01背包和完全背包
01背包/完全背包
最新推荐文章于 2019-06-21 02:06:50 发布