摘要: 该题是母函数的变种,也是一种多重背包问题,由于写了几篇这样的,所以就不重累述了,如果不懂可以看一下背包九讲;#include<stdio.h>#include<stdlib.h>int CompletePack( int f[],int val,int money ,int sum)//完全背包{ for( int i=val; i<=money;i++ ) { if( i>=val&&f[ i-val ]+val>f[i] ) { f[i]=f[i-val]+val; if( f[ i ]==i )//如果相等,则代表有这种情况 { 阅读全文
posted @ 2011-08-05 22:35 wutaoKeen 阅读(264) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2191#include<stdio.h>#include<stdlib.h>void CompletePack( int price,int f[],int money,int weight )//完全背包{ for( int i=price; i<=money; i++ ) { if( f[ i-price ]+weight>f[i] ) { f[i]=f[i-price] + weight; } } }void ZeroOnePack( int price,int nu 阅读全文
posted @ 2011-08-05 22:26 wutaoKeen 阅读(729) 评论(0) 推荐(0) 编辑
摘要: 今天学了一下多重背包,这是我A的第一个题,刚开始用用比较暴力的,没优化的多重背包就TLE了。代码如下:#include<stdio.h>#include<stdlib.h>int DP( int val[], int N ){ int f[100024]={0}; for( int i=1;i<=6; i++ )//取不同的元素 { for( int j=1; j<=val[i]; j++ )//取元素的个数 { for( int k=N; k>=0; k-- ) { int t=j*i; if( t<=k&&f[ k-t ]+t 阅读全文
posted @ 2011-08-05 17:54 wutaoKeen 阅读(398) 评论(0) 推荐(0) 编辑
摘要: 该题利用了我们的逆向思维,同时要注意该题他的质量是一定的,也就是说背包一定要是满的,刚开始对于这类背包我们令初始值是负无穷,而这题则相反,令初始值是正无穷,每次区最小的数,同时要注意f[j-weight[i]]!=inf应为一相等就与背包一定要满的条件相矛盾;#include<stdio.h>#include<stdlib.h>const int inf=0x7fffffff;int DP( int weight[],int val[],int N,int vol ){ int f[50024]={0}; for( int i=1; i<=vol; i++ ) f 阅读全文
posted @ 2011-08-05 14:45 wutaoKeen 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 该题是一道拓扑排序,拓扑排序就是每次寻找入度为0的节点,如果没有入度为0的节点但节点并没有完全找出,则该排名失败了;由于没有图,不好解释,建议你去看一下数据结构,我这里实现的是链表的方法:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct AOE{ int n; struct AOE *next;}AOE;struct T{ int n,flag; AOE *next;}VEX[524]; void build( int x, int y) //建立表{ AOE *p; if 阅读全文
posted @ 2011-08-05 11:34 wutaoKeen 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 这是一道赤裸裸的简单的完全背包,在HDU 2602中我说过在01背包优化的算法中提醒要注意v V--0,而不是0--V ,其实反过来就是完全背包;这个算法使用一维数组,先看伪代码:for i=1..N forv=0..Vf[v]=max{f[v],f[v-cost]+weight}你会发现,这个伪代码与P01的伪代码只有v的循环次序不同而已。这里还是要啰嗦一下,#include<stdio.h>#include<stdlib.h>int a[3]={ 150,200,350 };int DP( int money ){ int f[10024]={ 0 }; for( 阅读全文
posted @ 2011-08-05 11:20 wutaoKeen 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 由于受定势思维的的影响,一直没想到反过来去求他没有被录上的情况,其实44.0%是这样来的,就是1-((1-0.2)*(1.0.3)),(1-0.2)*(1.0.3)是最小的被录取的情况,同时该题是一道01背包。#include<stdio.h>#include<stdlib.h>float DP( int money[],float a[], int N ,int M){ float f[10024]; for( int i=0; i<=M; i++ ) f[i]=1; for( int i=1; i<=N; i++ ) { for( int j=M; j& 阅读全文
posted @ 2011-08-05 10:22 wutaoKeen 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 该题是一道背包题,并且是一个0,1背包,这种背包特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价 阅读全文
posted @ 2011-08-05 08:50 wutaoKeen 阅读(331) 评论(0) 推荐(1) 编辑