#include<iostream>
using namespace std;
#include <algorithm>
//背包问题
/*
A B C D
Weight 2 3 4 5
Value 3 4 5 6
*/
int w[5] = { 0 , 2 , 3 , 4 , 5 }; //商品的体积2、3、4、5
int v[5] = { 0 , 3 , 4 , 5 , 6 }; //商品的价值3、4、5、6
int bagVolume = 8; //背包大小
int dp[5][9] = { { 0 } }; //动态规划表
int item[5]; //最优解情况
void BestBagValue() { //动态规划
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= bagVolume; j++) {
if (j < w[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
}
void GetChoice(int i, int j) { //最优解情况
if (i > 0) {
if (dp[i][j] == dp[i - 1][j]) {
item[i] = 0;
GetChoice(i - 1, j);
}
else if (j - w[i] >= 0 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]) {
item[i] = 1;
GetChoice(i - 1, j - w[i]);
}
}
}
void print() {
cout<<"背包的总容量为"<<bagVolume<<endl;
cout<<"物品依次的重量如下"<<endl;
for(int i=1;i<=4;i++){
cout<<w[i]<<" ";
}
cout<<endl<<"物品价值如下"<<endl;
for(int j=1;j<=4;j++){
cout<<v[j]<<" ";
}
cout<<endl;
cout<<"填表如下"<<endl;
for (int i = 0; i < 5; i++) { //动态规划表输出
for (int j = 0; j < 9; j++) {
cout << dp[i][j] << ' ';
}
cout << endl;
}
cout << endl;
cout<<"四个物品0代表不装1代表装"<<endl;
for (int i = 1; i < 5; i++) //最优解输出
cout << item[i] << ' ';
cout << endl;
}
int main()
{
BestBagValue();
GetChoice(4, 8);
print();
return 0;
}
02-13
4万+
09-09
825
09-10
852
09-11
996