最近咋学习动态规划,之前也学过,但是每次学完之后就忘记了,所以希望能够写下来方便之后理解
01背包问题
有n个重量和价值分别为wi,vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值
1<=n<=100
1<=wi,vi<=100
1<=W<=10000
输入
n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5
输出
7(选择第0,1,3号物品)
dp[i+1][j]=dp[i][j] (j<w[i])
=max(dp[i][j],dp[i][j-w[i]]+v[i])
void solve(){
for(int i=0;i<n;i++){
for(int j=0;i<=W;j++){
if(j<w[i]){
dp[i+1][j]=dp[i][j];
}else{
dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}
这里需要理解一下i的下标以及输出的dp的下标
用一个数组来实现的代码:
int dp[MAX_N+1];
void solve(){
for(int i=0;i<n;i++){
for(int j=W;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",pd[W]);
}