输入
4 6 //4种物品,最多带走体积为6
1 4 //物品体积为1,价值为4
2 6
3 12
2 7
#include<iostream>
#include<algorithm>
using namespace std;
int N, V;
const int vMAX = 20;
const int nMAX = 20;
int v[20];
int w[20];
int val[nMAX][vMAX];//vol[i][j]:自前i种物品,取出体积不超过j,最大价值总和
int main(){
cin >> N >> V;
for (int i = 1; i <= N; ++i){
cin >> w[i] >> v[i];
val[0][i] = 0;
val[i][0] = 0;
}
for (int i = 1; i <= N; ++i){
cout << "前" << i << "种";
for (int j = 1; j <= V; ++j){
val[i][j] = val[i - 1][j]; //不选第i种物品,价值
if (j - w[i] >= 0) //j>v[i]时,选第i种物品
{
val[i][j] = max(val[i][j], val[i - 1][j - w[i]] + v[i]);
}
cout << val[i][j] << " ";
}
cout << endl;
}
cout << val[N][V];
return 0;
}
原始(复杂)思路分析:
边界条件确定问题;两次确定边界;
修改后:
只利用i=0与j=0;注意更新数组时i自1开始取值。
#include<iostream>
#include<algorithm>
using namespace std;
int N, V;
const int vMAX = 20;
const int nMAX = 20;
int v[20];
int w[20];
int val[nMAX][vMAX];//vol[i][j]:自前i种物品,取出体积不超过j,最大价值总和
int main(){
cin >> N >> V;
for (int i = 1; i <= N; ++i){
cin >> w[i]>>v[i];
val[0][i] = 0;
val[i][0] = 0;
}
for (int j = 1; j <= V; ++j){
if (w[1] <= j)
val[1][j] = v[1];
else
val[1][j] = 0;
}
for (int i = 0; i <= 1; i++){
cout << "前" << i << "种";
for (int j = 0; j <= V; ++j){
cout<< val[i][j] << " ";
}
cout<<endl;
}
for (int i = 2; i <= N; ++i){ //i=0、1已经计算过
cout <<"前"<< i << "种";
for (int j = 0; j <= V; ++j){ //j自1开始即可
val[i][j] = val[i - 1][j]; //不选第i种物品,价值
if (j - w[i] >= 0) //j>v[i]时,选第i种物品
{
//int tmp2 = val[i - 1][j - w[i]]+v[i]; //价值
val[i][j] = max(val[i][j], val[i - 1][j - w[i]] + v[i]);
}
cout << val[i][j] << " ";
}
cout << endl;
}
cout << val[N][V];
return 0;
}