0-1背包问题的动态规划解法
来源:互联网 发布:加工中心 自动编程 编辑:程序博客网 时间:2024/06/11 01:49
问题陈述:
给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。因此,该问题称为0-1背包问题。
问题的数学抽象:
此问题可转化为:给定c>0,wi>0,vi>0,1≤i≤n,要求找出一个n元0-1向量(x1,x2,…,xn),xi∈{0,1},1≤i≤n,使得∑wixi≤c,而且∑vixi达到最大。因此,0-1背包是一个特殊的整数规划问题:
max ∑vixi
s.t. ∑wixi≤c, xi∈{0,1},1≤i≤n
可用动态规划算法求解。
算法c源码
- #include "stdafx.h"
- #define N 10
- #define W 3
- int mv[N][W]; // mv[i][j]记录0~i件物品中,包重量为j的最大价值。
- int pack( int (&w)[N],int (&v)[N])
- {
- for(int i=0;i<W;++i) mv[0][i]=0;
- for(int i=0;i<N;++i) mv[i][0]=0;
- int j,i;
- //动态规划求解
- for(i=1;i<N;++i)
- {
- for(j=1;j<W;++j)
- if( j >= w[i] )
- {
- if( mv[i-1][j]< mv[i-1][j-w[i]]+v[i])
- mv[i][j] = mv[i-1][j-w[i]]+v[i];
- else
- mv[i][j] = mv[i-1][j];
- }
- else mv[i][j] = mv[i-1][j];
- }
- return mv[N-1][W-1];
- }
- int main()
- {
- int w[N]={0,2,3,4,5,6,7,8,9,10},v[N]={0,9,2,3,4,5,2,4,5,3};
- printf("%d",pack(w,v));
- return 0;
- }
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/2008823/137176.html#)
- 0-1背包问题--动态规划解法
- 0-1背包问题动态规划解法
- 0-1背包问题的动态规划解法
- 0-1背包问题的动态规划解法
- 0-1背包问题的动态规划解法
- 0-1背包的动态规划解法
- 背包问题的动态规划解法
- 01背包问题的动态规划解法
- java--0-1背包问题--动态规划解法
- 0-1背包问题的动态规划解法为什么是NPC问题?
- 为什么0-1背包问题是NP完全问题,但该问题还有动态规划的解法?
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 0-1背包问题的两种解法(回溯法和动态规划)
- 01背包问题 动态规划解法
- 【转】 01背包问题 动态规划解法
- 算法-0-1背包的动态规划,回溯,分支限界三种解法
- 动态规划法求解简单的(0/1)背包问题
- 0/1背包问题的动态规划法
- *** 易经 与 相对论的猜想 ***
- 排序算法——合并排序
- 中国IT成功人士特点6大成功密码全解析
- 子网的概念
- Javascript的document,window对象(DOM)
- 0-1背包问题的动态规划解法
- 你还记得小时候怎么吃药的吗?
- 递归求解多项式以及递归求排列
- IP数据报
- 【第6章】模仿MINIX的中断处理【一】
- [ 转]引用与指针的比较
- 俺的工作啊
- 学会选择
- Struts2教程4:使用validate方法验证数据