各种背包(01背包, 完全背包, 多重背包)(SDNUOJ1033采药)(SDNUOJ1043采药2)

本文介绍了三种类型的背包问题:01背包、完全背包和多重背包,分别给出了它们的状态转移方程和解决方案。通过动态规划求解如何在背包容量限制下,使物品价值最大化。01背包不允许重复选取物品,完全背包中每种物品可无限选取,多重背包则是每种物品有限定数量。
摘要由CSDN通过智能技术生成

1.01背包问题

有N种物品与承重为W的背包。每种物品只有一件,每个物品都有对应的重量w[i]与价值v[i],求解如何装包使得价值最大。

w[i]表示i物品的重量

v[i]表示i物品的价值

f[i][j]表示有i个物品 ,容量为j时的最优解

W总容积

N物品个数

当变成i+1个物品时

第i+1个物品不放进背包dp[i+1][j]=dp[i][j]

第i+1个物品放进背包dp[i+1][j]=dp[i][j-w[i+1]]+v[i+1]

状态方程:dp[i+1][j]=max(dp[i][j], dp[i][j-w[i+1]]+v[i+1])

[cpp]  view plain  copy
  1. for (int i = 1; i <= N; i++)  //从1开始(从0开始f[i-1][j]会越界)判断每个物品能否放进  
  2.         for (int j = 1; j <= W; j++)  //对每个状态进行判断  
  3.         {    
  4.             if (w[i] <= j)//能放进去  
  5.             {    
  6.                 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);    
  7.             }    
  8.             else    
  9.                 dp[i][j] = dp[i-1][j];    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值