您的位置:首页 > 编程语言 > C语言/C++

C++动态规划算法之0-1背包问题

2017-08-24 13:47 295 查看
0-1背包问题


题目描述

有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?


输入

第1行:2个整数n(1<=n<=1000)和W(1<=W<=10000),分别表示物品的件数和背包的最大载重量。

第2-n+1行:每行2个用空格分开的整数,第i+1行的整数表示第i件物品的重量wi和价值bi(1<=bi,wi<=10000)。


输出

第1行:1个整数,表示背包所能装下的物品的最大总价值。

第2-?行:每行3个用空格分开的整数,i, wi, bi,分别表示最优解中的物品的编号、重量和价值。


样例输入

4 5
2 3
3 4
4 5
5 6



样例输出

7
1 2 3
2 3 4


题目分析

这道题是背包问题的其中一种,除此之外还有部分背包问题、完全背包问题、多重背包问题等,我就不一一介绍了。所谓0-1背包问题,0就是指不要此件物品,1就是指要这件物品,也就是说你不能像部分背包问题那样把物品分开。而且每种物品只有一件,不可以像完全背包问题、多重背包问题那样有很多件。这道题还在原来的基础上要求了输出物品序号,对生活中的我们都更加实用。话不多说,下面是代码:

#include<cstdio>
#include<iostream>
using namespace std;
int N,W,b[1002],w[1002],f[1002][10002];
void wxy(int i,int j)
{
if(!i) return ;
if(w[i]>j||f[i-1][j]>=f[i-1][j-w[i]]+b[i])
wxy(i-1,j);
else
{
wxy(i-1,j-w[i]);
cout<<i<<" "<<w[i]<<" "<<b[i]<<endl;
}
}
int main()
{
cin>>N>>W;
for(int i=1;i<=N;i++)
cin>>w[i]>>b[i];
for(int i=1;i<=N;i++)
for(int j=1;j<=W;j++)
{
if(w[i]>j)
f[i][j]=f[i-1][j];
else
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+b[i]);
}
cout<<f
[W]<<endl;
wxy(N,W);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息