一、问题阐述
二、效果图
三、源代码
#include<iostream>
using namespace std;
#define N 5//5个物品
#define LIMIT 10//容量为10
//问题表示
int w[N] = { 5,2,3,6,3 };//w重量
int v[N] = { 5,5,6,9,8 };//v价值
int V[N + 1][LIMIT + 1] = { 0 };
void dp() {
int i, j;
for (i = 0; i <= N; i++) {//容量为0
V[i][0] = 0;
}
for (j = 0; j <= LIMIT; j++) {//物品为0
V[0][j] = 0;
}
for (i = 1; i <= N; i++) {//物品
for (j = 1; j <= LIMIT; j++) {//容量
int weight = w[i - 1];//当前物品的重量
int value = v[i - 1];//当前物品的价值
if (weight > j) {//放不下
V[i][j] = V[i - 1][j];
}
else {//放得下
int t1 = V[i - 1][j];//不放
int t2 = V[i - 1][j - weight] + value;//放
V[i][j] = t1 > t2 ? t1 : t2;//最大价值
}
}
}
cout<< V[i][j];
}
//根据表倒推选中的物品
int S[N] = { 0 };
void getSelected(int c, int n) {
if (n <= 0 || c <= 0)//出口
return;
if (V[n][c] > V[n - 1][c]) {//被选中
S[n - 1] = 1;//选中
c -= w[n - 1];//容量变小
}
getSelected(c, --n);//前一个物品
}
int main() {
int k ;
dp();
getSelected(5,10);
for (k=0; k < 5; k++) {
if (S[k] == 1) {
cout << k;
}
}
}