1. 问题
有 n 个物品,它们有各自的重量 weight 和价值 value,现有给定容量 C 的背包,如何让背包里装入的物品具有最大的价值?每个物品能够使用多次。
2. 分析
需要求解的是:最大价值 MaxValue
约束条件:选择的物品总重量 < C
递推公式:如果
k
∗
w
[
i
]
<
=
j
k * w[i] <= j
k∗w[i]<=j 说明可以装入该物品,循环装进去 1,2,3…k 个,因此
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
]
[
j
]
,
d
p
[
i
−
1
]
[
j
−
k
∗
w
[
i
]
]
+
k
∗
v
[
i
]
)
dp[i][j] = max(dp[i][j], dp[i-1][ j-k*w[i] ] + k * v[i])
dp[i][j]=max(dp[i][j],dp[i−1][j−k∗w[i]]+k∗v[i])
3. 代码
#include<iostream>
#include<cmath>
using namespace std;
int C; //背包容量
int number; //物品数量
int w[10], v[10]; //物品的重量和价值
int dp[10][15] = {{0}}; //保存价值的二维数组--动态规划
//找到最大价值
void MaxValue()
{
for(int i = 1;i < number;i++){
for(int j = 1;j <= C;j++){
for(int k = 0;k*w[i] <= j;k++){
dp[i][j] = max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);
}
}
}
}
int main()
{
cout<<"完全背包问题"<<endl;
cout<<"Please input the bag's capacity:";
cin>>C;
cout<<"Please input goods' number:";
cin>>number;
cout<<"Please input goods' weight:";
for(int i = 1;i <= number;i++){ //注意:i从1开始
cin>>w[i];
}
cout<<"Please input goods' value:";
for(int i = 1;i <= number;i++){
cin>>v[i];
}
MaxValue(); //找到最大价值 -- 动态规划
cout<<"\n(1)动态规划\nThe bag's max vlaue is :"<<dp[number-1][C]<<endl;
cout<<"The values of dp[][] are as follows:\n";
for(int i = 0;i < number;i++){ //输出dp数组
for(int j = 0;j <= C;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}