假如我们有一个背包,在我们面前摆了 i 件物品,这些物品的价值分别为 v,
怎么装可以保证背包里所有物品加起来价值最大。(注意:一件物品只能拿一次)
0代表这个物品不拿,1代表这个物品拿,其实就代表着拿和不拿的问题
有三个物品,它们的重量分别为1,3,2 价值为:1,4,3
现在有个容量为4的背包,怎么装可以保证所装入物品价值总和最大?
物品价值数组: int v[4]={0,1,4,3};
物品重量数组: int w[4]={0,1,3,2};
物品:i 包容量:j其实就是比较 背包的容量 和 物品的重量,分为两种情况:
状态转移方程:
dp[i][j] = max(v[i]+dp[i-1][j-w[i]],dp[i-1][j]);
dp[i][j] = max(装它,不装它); 比较看装它还是不装它的价值大
#include <iostream>
using namespace std;
int main(){
int v[4]={0,1,4,3};//物品价值
int w[4]={0,1,3,2};//物品重量
int dp[10][10] = {0}; //记录状态
// dp[ i ][ j ] 表示第i件物品,背包容量为 j时的最大价值
for(int i=1;i<4;i++){//物品
for(int j=1;j<=4;j++){//包容量
if(j>=w[i]){//如果包的容量大于等于物品容量
dp[i][j] = max(v[i]+dp[i-1][j-w[i]],dp[i-1][j]);//状态转移方程
}else dp[i][j] = dp[i-1][j];//包容量小于(装不下)物品容量,相当于不装
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}