您的位置:首页 > 其它

【贪心】0/1背包

2016-07-22 10:59 351 查看

贵有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。

问题 P: 【贪心】0/1背包

【贪心】0/1背包

时间限制: 1 Sec 内存限制: 128 MB

题目描述

有一容量为weight的背包。现在要从n件物品中选取若干装入背包中,每件物品i的重量为w[i],价值为p[i]。定义一种可行的背包装载为:背包中物品的总重量不能超过背包的容量,并且一个物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。

输入

第1行一个整数,表示背包的重量weight 第2行一个整数,表示n件物品 第3行有n个整数,分别表示n个物品的重量 第4行有n个整数,分别表示n个物品的价值

输出

共两行。第1行n个物品的选取状态,0表示不取,1表示取。n个状态用空格分隔,行尾无空格。第2行表示装入物品的最高价值。

样例输入

11
4
2 4 6 7
6 10 12 13

样例输出

0 1 0 1
23


#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int lm,n,weight,w[1111],v[1111],last[1111],dlast[1111];

void ss(int i,int dm,int dw)
{
/*
i——第i个物品
dm——当前的最大价值
dw——当前的重量
*/
if(i<n)
{
dlast[i]=0;
ss(i+1,dm,dw);
if(weight>=dw+w[i])
{
dm+=v[i];
dw+=w[i];
dlast[i]=1;
ss(i+1,dm,dw);
}
}
else
{
if(dm>lm)
{
for(int i=0;i<n;i++)
last[i]=dlast[i];
lm=dm;
}
}
}

int main()
{
while(cin>>weight>>n)
{
lm=0;
memset(last,0,sizeof(last));
memset(dlast,0,sizeof(dlast));
for(int i=0;i<n;i++)
cin>>w[i];
for(int i=0;i<n;i++)
cin>>v[i];
ss(0,0,0);
for(int i=0;i<n;i++)
{
if(i==n-1)  //行尾不能有空格
{
cout<<last[i]<<endl;
break;
}
cout<<last[i]<<" ";
}
cout<<lm<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: