问题描述
给定 n 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 k,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
例如:
有3个物品,总重量为4
选择问题,
不选择dp[i][j]=dp[i-1][j]
选择dp[i][j]=c[i]+dp[i-1][j-w[i]]
动态转移方程:
//不选择
dp[i][j]=dp[i-1][j];
//如果可以选择 选择后的最优解
if(w[i]<=j)dp[i][j]=max(dp[i][j],c[i]+dp[i-1][j-w[i]]);
#include<bits/stdc++.h>
#define N 110
#define INF 0x3f3f3f3f
using namespace std;
int c[N],w[N],k,n,dp[N][N];
/*
c[N]数组表示价值
w[N]数组表示质量
k表示存储容量
n表示物品个数
*/
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>c[i]>>w[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
dp[i][j]=dp[i-1][j];
if(w[i]<=j)dp[i][j]=max(dp[i][j],c[i]+dp[i-1][j-w[i]]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<dp[n][k]<<endl;
return 0;
}
可优化代码:
#include<bits/stdc++.h>
#define N 110
#define INF 0x3f3f3f3f
using namespace std;
int c[N],w[N],k,n,dp[N];
/*
c[N]数组表示价值
w[N]数组表示质量
k数组表示存储容量
n数组表示物品个数
*/
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>c[i]>>w[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=k;j>=w[i];j--){
dp[j]=max(dp[j],c[i]+dp[j-w[i]]);
}
}
cout<<dp[k]<<endl;
return 0;
}
理解可参考:https://www.cnblogs.com/kkbill/p/12081172.html