C-01背包问题
【声明】:非常感谢http://blog.sina.com.cn/s/blog_6dcd26b301013810.html,给我带来的帮助。

看这个图片表示的意思:
w[i]表示第i件物品的容积 ,p[i]第i件物品的价值。
c[i][j] 表示 第i件物品装入容积为j 的空间中的最高价值。 其中i是物品编号,j代表当前背包的容积。
非常重要的状态转移方程:
C[i][j] = max(C[i-1][j],C[i-1][j-w[i]]+p[i])
C[i-1][j]表示放第i-1件物品,背包容量为j的总价值。
C[i-1][j-w[i]]表示存放第i-1件物品,背包容量为 j-w[i] 的总价值;再加上当前第i件物品的价值
【也就是说在选择是不是要放一件物品时,就看看不放该物件的价值 与 放了该物件的总价值 哪个更大一点的问题。】
int knapsack(int m,int n)//总容量,物品数量
{
int i,j,w[],p[];//每件物品的容量个价值
for(i=;i<n+;i++)
scanf("\n%d,%d",&w[i],&p[i]); for(i=;i<;i++)
for(j=;j<;j++)
c[i][j]=; for(i=;i<n+;i++)//数量
for(j=;j<m+;j++)
{
if(w[i]<=j){//j表示当前容量,当前容量如果小于该件物品的容量,
//也就是该件物品放不进去背包
if(p[i]+c[i-][j-w[i]]>c[i-][j])
c[i][j]=p[i]+c[i-][j-w[i]];
else
c[i][j]=c[i-][j];
}else c[i][j]=c[i-][j];
}
return(c[n][m]);
}
01
由于使用一维数组解01背包会被多次用到,完全背包的一种优化实现方式也是使用一维数组,所以我们有必要理解这种方法。
如果只使用一维数组f[0…v],我们要达到的效果是:
第i次循环结束后f[v]中所表示的就是使用二维数组时的f[i][v],即前i个物体面对容量v时的最大价值。
我们知道f[v]是由两个状态得来的,f[i-1][v]和f[i-1][v-c[i]],使用一维数组时,当第i次循环之前时,f[v]实际上就是f[i-1][v],那么怎么得到第二个子问题(f[i-1][v-c[i]])的值呢?事实上,如果在每次循环中我们以v=V…0的顺序推f[v]时,就能保证f[v-c[i]]存储的是f[i-1][v-c[i]]的状态。状态转移方程为:
v = V...0; f(v) = max{ f(v), f(v-c[i])+w[i] }
我们可以与二维数组的状态转移方程对比一下
f(i,v) = max{ f(i-1,v), f(i-1,v-c[i])+w[i] }

还是看上图:如果按照v=0-V的顺序的话,第一件物品存入包中和上图一样,当存入第二件物品的时候,v= 4时,价值为5。但是没有办法准确知道f[i-1][v-c[i]](即f[v-c[i])。【由于是一维数组,数据会被覆盖】
但是,如果按照v = V--0的顺序。存入第一件物品的时候,和上图是一样的,此时f[10] = ...=f[5] = 4,开始存放第二件物品的时候,v =V = 10;f(v) = max{ f(v), f(v-c[i])+w[i] }(即f[10] = max{f[10],f[10-c[2]+w[2]} = max{f[10],f[6]+w[2] = max{4,4+5} = 9);v = 9……以此类推就可以得出上图中的第二行。
【再想不明白,自己按照上图执行一遍即可。】
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100+10 int f[MAXN];
int w[MAXN],c[MAXN]; int main()
{
int N,V;
int i=,j;
scanf("%d%d",&V,&N);
for(i = ;i<N;i++)
{
scanf("%d%d",&c[i],&w[i]);
}
memset(f,,sizeof(f));
for(i = ;i<N;i++)
for(j = V;j>=c[i];j--)
{
f[j] = f[j]>(f[j-c[i]]+w[i]) ? f[j]: f[j-c[i]]+w[i];
} printf("max value si %d\n",f[V]);
return ;
}
这样一来就全部解决了问题了………………^__^
C-01背包问题的更多相关文章
- 01背包问题:POJ3624
背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们 ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- HDU 1864最大报销额 01背包问题
B - 最大报销额 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDOJ 2546饭卡(01背包问题)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如 ...
- YTU 2335: 0-1背包问题
2335: 0-1背包问题 时间限制: 1 Sec 内存限制: 128 MB 提交: 15 解决: 12 题目描述 试设计一个用回溯法搜索子集空间树的函数.该函数的参数包括结点可行性判定函数和上界 ...
- c语言数据结构:01背包问题-------动态规划
两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...
- HDU2602 (0-1背包问题)
N - 01背包 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
- poj3624 简单的01背包问题
问题描述: 总共有N种宝石供挑选,宝石i的重量为Wi,吸引力为Di,只可以用一次.Bessie最多可负担的宝石手镯总重量为M.给出N,M,Wi,Di,求M. 非常标准的01背包问题.使用了优化的一维数 ...
- hdu5188 加限制的01背包问题
http://acm.hdu.edu.cn/showproblem.php? pid=5188 Problem Description As one of the most powerful brus ...
- 01背包问题(Java实现)
关于背包问题,百度文库上有崔添翼大神的<背包九讲>,不明的请移步查看.这里仅介绍最基本的01背包问题的实现. public class Knapsack { private final i ...
随机推荐
- 解决外贸电商难题,PayPal中国外贸电商大会圆满礼成
在全球经济一体化的背景下,越来越多的中国企业将目光转移到了海外.对中国的企业而言,要想将生意做到海外大致有两种方法可供选择,一是到海外设立分支机构或者分公司,二是通过外贸电子商务平台实现交易. ...
- Android JNI入门第四篇——Android.mk文件分析
ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...
- Ext JS学习第五天 Ext_window组件(二)
此文用来记录学习笔记 •上一讲我们已经学过了window的使用,那么在这将中,我们将结合然后把Ext中需要注意的地方,以及组建的使用给予介绍.indow做几个Web开发的经典示例. •ExtWeb实战 ...
- React Native-目前最火的前端技术?
做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调成 16号呗,颜色变成 #FFFF00FF,老大说这里最好改一下”,作为一名 app 的开发只能无奈但心里窃喜的告诉你,“只能等下个版本了,必须 ...
- NSNumber与NSInteger的区别
Objective-C 支持的类型有两种:基本类型 和 类. 基本类型,如同C 语言中的 int 类型一样,拿来就可以直接用. 而类在使用时,必须先创建一个对象,再为对象分配空间,接着做初始化和赋值 ...
- 深入select_related与prefetch_related函数
阅读博客http://blog.jobbole.com/74881/的笔记 在数据库有外键的时候,使用select_related()和prefetch_related()可以很好的减少数据库请求的次 ...
- codeblocks + MinGW 以及vc 使用预编译头文件的方法
MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)” 你会看到一个多页面的属性框,选择“构建(build)”页面 ...
- Windows Phone 8初学者开发—第5部分:布局和事件基础
原文 Windows Phone 8初学者开发—第5部分:布局和事件基础 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Developme ...
- Cloud Foundry中warden的网络设计实现——iptable规则配置
在Cloud Foundry v2版本号中,该平台使用warden技术来实现用户应用实例执行的资源控制与隔离. 简要的介绍下warden,就是dea_ng假设须要执行用户应用实例(本文暂不考虑ward ...
- Android FragmentPagerAdapter和FragmentStatePagerAdapter的区别
FragmentPagerAdapter官方解释: This version of the pager is best for use when there are a handful of typi ...