经典问题之01背包
2012-04-10 19:04
267 查看
动态规划像一个生产车间有好多连续的生产线 一个阶段就是一个生产线 状态就是每个生产线物品的状态 决策就是生产线上根据物品的状态而对物品的操作.
01背包问题:
阶段: 第一生产线(放不放第一个物品)→第二生产线(放不放第二个物品)→.......→第N生产线(放不放第N个物品)
第一生产线共有n-v1个选择: v=V时放不放 v=V-1时放不放.....v=V-v1时放不放
然后移交给第二生产线: 共有n-v2个选择: v=V时放不放 v=V-1时放不放.....v=V-v2时放不放
......
然后移交给第N生产线: 共有n-v(n)个选择: v=V时放不放 v=V-1时放不放.....v=V-v(n)时放不放
以第N生产线为例: 当v=V-i时 f[v]>f[v-v(n)]+w 不放 因为v=V-i时前面生产线已经生产出更好的产品了,没必要再加工了.
状态: f[v]就是状态的存储结构,是连续的,表示产品每个部分的加工情况.就像工厂里的一个大屏幕,上面记录着产品的每个部分的生产情况.
每个生产线都看着共享着.第一个生产线生产完了,把其记录在屏幕上,等第二生产线开始生产时参考,如果能生产出比第一生产线更优的产品则生产,否则不生产.
决策: 每个生产线共有很多的选择,产品有不同的状态,例如v可以从0 to V,先让第一生产先分别加工,再让第二生产线加工,如过某一个状态有比第一生产线生产的更优秀则重新加工.
状态: 是在前i件物品中,选取若干件物品其体积总和不大于 j,所能获得的最大价值为f[j]
第一个阶段(即只放第一个物品) 共有n-v1个状态(vi为第i个物品的重量)
第二个阶段 共有n-v2个状态
第n个阶段 共有n-v(n)个状态
阶段: 第i件物品放不放 共有n个阶段
决策: 是第 i件物品放或者不放
转移方程: f[v]=max(f[v],f[v-c]+w)
例如:
NYOJ 289 苹果
01背包问题:
阶段: 第一生产线(放不放第一个物品)→第二生产线(放不放第二个物品)→.......→第N生产线(放不放第N个物品)
第一生产线共有n-v1个选择: v=V时放不放 v=V-1时放不放.....v=V-v1时放不放
然后移交给第二生产线: 共有n-v2个选择: v=V时放不放 v=V-1时放不放.....v=V-v2时放不放
......
然后移交给第N生产线: 共有n-v(n)个选择: v=V时放不放 v=V-1时放不放.....v=V-v(n)时放不放
以第N生产线为例: 当v=V-i时 f[v]>f[v-v(n)]+w 不放 因为v=V-i时前面生产线已经生产出更好的产品了,没必要再加工了.
状态: f[v]就是状态的存储结构,是连续的,表示产品每个部分的加工情况.就像工厂里的一个大屏幕,上面记录着产品的每个部分的生产情况.
每个生产线都看着共享着.第一个生产线生产完了,把其记录在屏幕上,等第二生产线开始生产时参考,如果能生产出比第一生产线更优的产品则生产,否则不生产.
决策: 每个生产线共有很多的选择,产品有不同的状态,例如v可以从0 to V,先让第一生产先分别加工,再让第二生产线加工,如过某一个状态有比第一生产线生产的更优秀则重新加工.
状态: 是在前i件物品中,选取若干件物品其体积总和不大于 j,所能获得的最大价值为f[j]
第一个阶段(即只放第一个物品) 共有n-v1个状态(vi为第i个物品的重量)
第二个阶段 共有n-v2个状态
第n个阶段 共有n-v(n)个状态
阶段: 第i件物品放不放 共有n个阶段
决策: 是第 i件物品放或者不放
转移方程: f[v]=max(f[v],f[v-c]+w)
例如:
NYOJ 289 苹果
#include<cstdio> #include<cstring> #define max(x,y) x>y?x:y int f[1005]; int main() { int n,V,c,w; while(1) { scanf("%d%d",&n,&V); if(!(n||V)) return 0; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { scanf("%d%d",&c,&w); for(int v=V;v>=c;v--) f[v]=max(f[v],f[v-c]+w); } printf("%d\n",f[V]); } }
相关文章推荐
- HDU 2955 Robberies(经典01背包概率问题)
- 01背包经典问题
- 01背包问题 -- 经典动态规划题
- poj1276 多重背包问题 转换为经典的01背包
- 动态规划经典:01背包问题
- 01背包问题——经典DP问题,优化与未优化
- 01背包问题,是用来介绍动态规划算法最经典的例子
- 动态规划的两个经典问题--01背包
- 数据结构经典算法学习之01背包问题
- 经典问题之01与完全背包总结
- 01背包问题【动态规划】
- 01背包问题
- 背包九讲之一 P01: 01背包问题
- 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏
- 高数Umaru系列(9)——哈士奇(01背包,经典练习)
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- 01背包问题 动态规划
- C#用递归算法解决经典背包问题
- 背包问题(Knapsack problem)之01
- 经典算法(2)——0/1背包问题(动态规划法)(ZZ)