您的位置:首页 > 其它

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]值最大.

#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
运行结果:

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