1.题目要求
动态规划实现0-1背包在固定容量c的情况下获得最大价值问题,输出可容纳的最大价值,输入物品种类、背包容量、物品重量和价值,输出最大价值。
格式要求可参考如下:
输入:
请输入物品种类n,并按Enter换行:5
请输入背包容量c,并按Enter换行:10
请输入n个物品的重量,中间以英文逗号隔开,按Enter结束:1,4,2,5,2
请输入n个物品的价值,中间以英文逗号隔开,并按Enter结束: 1,6,5,3,1
输出:12
2.完整代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int c[10][100];//对应每种情况的最大价值
//实现功能
int knapsack(int m, int n) {
char q;//实现键入数字“,”隔开
int i, j,w[10], p[10];
cout << "请输入"<<n<<"个物品的重量(中间以英文逗号隔开):" << endl;
//输入数组逗号隔开的实现1
vector<int> a;
string str1;
cin >> str1;
for (int i = 0; i < str1.size(); i++) {
if (str1[i] != ',') a.push_back((int)str1[i] - 48);
}
for (int i = 0; i < a.size(); i++) {
w[i]=a[i];//w[i]是需求数组
}
cout << "请输入" << m << "个物品的价值(中间以英文逗号隔开):" << endl;
//输入数组逗号隔开的实现2
vector<int> b;
string INPUT;
cin >> INPUT;
for (int i = 0; i < INPUT.size(); i++) {
if (INPUT[i] != ',') b.push_back((int)INPUT[i] - 48);
}
for (int i = 0; i < b.size(); i++) {
p[i]= b[i];//p[i]是需求数组
}
for (i = 0; i < 10; i++)
for (j = 0; j < 100; j++)
c[i][j] = 0;//初始化数组
cout << "----------动态规划表----------- " << "\n |" << endl;;
for (j = 0; j <= m; j++)
cout<<j<<" ";
cout << "\n----------------------------" << "\n" << endl;
for (i = 0; i <= n; i++)
{
cout<<i << " ";
for (j = 0; j <= m; j++)
{
if (i == 0 || j == 0) {
cout<<c[i][j] << " ";
continue;
}
if (w[i] <= j) //如果当前物品的容量小于背包容量
{
if (p[i] + c[i - 1][j - w[i]] > c[i - 1][j])
/*如果本物品的价值加上背包剩下的空间能放的物品的价值*/
/*大于上一次选择的最佳方案则更新c[i][j]*/
c[i][j] = p[i] + c[i - 1][j - w[i]];
else
c[i][j] = c[i - 1][j];
}
else /*如果当前物品的容量小于背包容量,即此物品装不下!*/
c[i][j] = c[i - 1][j];//i表示物品总共的个数,j表示背包的载重量 ,c[i][j]就是当前的价值
cout << c[i][j] << " ";
}
cout<<endl;
}
cout<<"------------------------------"<<"\n" << endl;
return c[n][m]; //n代表物品总共的个数,m表示背包的载重量,c[n][m]就是当前的价值
}int main(void)
{
int c, n;
int i, j;
cout<<"请物品的种类n:"<<endl;
cin>>n;
cout << n << endl;
cout << "请输入背包容量c:" << endl;
cin >> c;
cout << c << endl;
cout<<"旅行者背包能装的最大总价值为:"<< knapsack(c, n)<<endl;
cout<<endl;
system("pause");
return 0;
}
3.运行结果