0-1背包问题动态规划详解
2013-05-19 18:59
316 查看
最近开始学习背包问题,在此做些笔记,先学习最简单的0-1背包问题。
0-1背包问题介绍:
一,背包问题基本解决
有一个背包可以存放M斤物品,有N件物品(每件物品只有1件),他们重量分别是w1,w2,w3..........,他们价值分别是p1,p2,p3...............。问怎么装载物品,使背包装的载物品价值最大?
举例说明:
背包装10斤物品,有3件物品,重量分别是3斤,4斤,5斤,价值分别是4,5,6;
可以画一个矩阵,行号0,1,2,3,行号0表示0件物品可放入背包情况下,背包装载最大价值,行号1表示只有第一件物品可以放入背包情况下,背包装载最大价值,行号2表示只有第1件和第2件可以放入背包情况下,背包装载最大价值,......
列号0,1,2,3.............10表示背包剩余可用容量,列号0表示背包已满时候,剩余容量为0时候,还可以装载的最大价值;列号1表示背包剩余容量为1时候,还可以装载的最大价值,......
当行号是3,列号是10时候,价值最大,即c[3][10]值最大.
View Code
运行结果:
0-1背包问题介绍:
一,背包问题基本解决
有一个背包可以存放M斤物品,有N件物品(每件物品只有1件),他们重量分别是w1,w2,w3..........,他们价值分别是p1,p2,p3...............。问怎么装载物品,使背包装的载物品价值最大?
举例说明:
背包装10斤物品,有3件物品,重量分别是3斤,4斤,5斤,价值分别是4,5,6;
可以画一个矩阵,行号0,1,2,3,行号0表示0件物品可放入背包情况下,背包装载最大价值,行号1表示只有第一件物品可以放入背包情况下,背包装载最大价值,行号2表示只有第1件和第2件可以放入背包情况下,背包装载最大价值,......
列号0,1,2,3.............10表示背包剩余可用容量,列号0表示背包已满时候,剩余容量为0时候,还可以装载的最大价值;列号1表示背包剩余容量为1时候,还可以装载的最大价值,......
当行号是3,列号是10时候,价值最大,即c[3][10]值最大.
#include <cstdio> const int K = 100; /* 输入格式: 10 3 //M=10,N=3 3 4 //w[1]=3,p[1]=4 4 5 //w[2]=4,p[2]=5 5 6 //w[3]=5,p[3]=6 */ int max(int a,int b){ return a>b?a:b; } int main(){ int M,N,w[K],p[K],i,j,f[K] = {0}; scanf("%d%d",&M,&N); for (i = 1;i <= N;i++) { scanf("%d%d",&w[i],&p[i]); } for (i = 1;i <= N;i++) { for (j = M;j > 0;j--) { if (w[i] <= j) { f[j] = max(f[j],p[i]+f[j-w[i]]); } } } printf("%d\n",f[M]); return 0; }
View Code
运行结果:
相关文章推荐
- 背包问题(dp动态规划思路详解)
- 0/1背包问题动态规划详解(转)
- 0/1背包问题动态规划详解之一
- 背包问题动态规划详解
- 01背包问题动态规划详解
- 01背包问题动态规划详解(转载)
- 0/1背包问题动态规划详解
- 动态规划之背包问题详解
- 0/1背包问题动态规划详解
- 01背包问题动态规划详解(转载)
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 0/1背包问题动态规划详解
- 动态规划:背包问题
- 【初学动态规划】之01背包问题
- 动态规划的两个经典问题--01背包
- 动态规划实例(七):01背包问题最大价值
- 动态规划+背包问题
- 动态规划之0--1分数背包问题
- 动态规划:最少硬币找零问题、01背包问题、完全背包问题