0-1背包问题c版

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0/1背包问题动态规划详解及C++代码

1.问题描述

给定一个载重量为C的背包,有n个物品,其重量为w

i,价值为v

i,1<=i<=n,要求:把物品装入背包,并使包内物品价值最大

2.问题分析

在0/1背包问题中,物体或者被装入背包,或者不被装入背包,只有两种选择。

循环变量i,j意义:前i个物品能够装入载重量为j的背包中

数组c意义:c[i][j]表示前i个物品能装入载重量为j的背包中物品的最大价值若w[i]>j,第i个物品不装入背包

否则,若w[i]<=j且第i个物品装入背包后的价值>c[i-1][j],则记录当前最大价值(替换为第i个物品装入背包后的价值)

其c++代码如下

#include

using namespace std;

void KANPSACK_DP(int c[50][50], int w[50], int v[50], int n, int C)

{

for(int i = 0; i <= C; i ++)

{

c[0][i] = 0;

}

for(int i = 1; i <= n; i ++)

{

c[i][0] = 0;

for(int j = 1; j <= C; j ++)

{

if(w[i] <= j)

{

if(v[i] + c[i - 1][j - w[i]] > c[i - 1][j])

c[i][j] = v[i] + c[i - 1][j - w[i]];

else c[i][j] = c[i - 1][j];

}

else c[i][j] = c[i - 1][j];

}

}

}

void OUTPUT_SACK(int c[50][50], int x[50], int w[50], int n, int C) {

for(int k = n; k >= 2; k --)

{

if(c[k][C] == c[k-1][C])

x[k] = 0;

else {

x[k] = 1;

C = C - w[k];

}

}

x[1] = c[1][C] ? 1 : 0;

}

int main()

{

int c[50][50];

int w[50],v[50];

int x[50];

int C,n;

cout<<"输入物品的总个数:"; cin>>n;

cout<<"输入背包的总容量:"; cin>>C;

cout<<"依次输入物品的重量:"<

{

cin >> w[i];

}

cout<<"依次输入物品的价值:"<

{

cin >> v[i];

}

KANPSACK_DP(c, w, v, n, C);

OUTPUT_SACK(c, x, w, n, C);

cout<<"最优解为:"<

for(int i = 1; i <= n; i ++)

{

cout<

}

cout<

system("pause");

return 0;

}

运行结果如下

输入物品的总个数:5

输入背包的总容量:10

依次输入物品的重量:2 2 6 5 4

依次输入物品的价值:6 3 5 4 6

最优解为:

11001

最大容量为:

15

请按任意键继续. . .

相关文档
最新文档