问题描述:给定 n 个物品和一个容量为 C 的背包,请给出物品装入背包的方案,使得背包中物品的总价值 M 最大,并满足:
• 每个物品 I 的重量为 wi,价值为 vi。
• 每个物品不可拆分,要么完整装入背包,要么不在背包里。
• 背包中物品的总重量不能超过容量 C 。
以以下数据为例子:
#include<iostream>
#include<stdio.h>
using namespace std;
#define Max_weight 5//背包承载最大重量
#define num 4//定义物体个数
int a[5][6] = { {0 } };//记录物品是否被选择
void Dprocessing(int* w, int* v, int f[num + 1][Max_weight + 1])
{
int i = 0, j = 0;
for (i = 1; i <= num; i++) {
for (j = 1; j <= Max_weight; j++) {
if (j >= w[i]) {
f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
if (f[i - 1][j] < f[i - 1][j - w[i]] + v[i])
{
a[i][j] = { 1 };
}
else a[i][j] = { 0 };
}
else f[i][j] = f[i - 1][j];
}
}
cout << "背包能装的最大价值是:" << f[i - 1][j - 1] << endl;
}
int main() {
int f[num+1][Max_weight+1] = {0};
int w[5] = { 0,2,1,3,2 }; //物重w
int v[5] = { 0,12,10,20,15 }; //物价p
Dprocessing(w, v, f);
for (int i = 1; i < num + 1; i++)
{
printf("%d ", i);
printf("%2d ", a[4][i+1]);
printf("%d ", v[i]);
for (int j = 1; j < Max_weight + 1; j++)
{
printf("%2d ", f[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
第一列为物品序号;第二列为是否选择装入该物品;第三列为物品价值
第四——八列为装入1——5重量物品时背包的最大重量。