您的位置:首页 > 其它

01背包问题

2017-10-24 19:03 190 查看
最近咋学习动态规划,之前也学过,但是每次学完之后就忘记了,所以希望能够写下来方便之后理解

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
[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]);
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  01背包 dp