上一页 1 ··· 6 7 8 9 10 11 12 下一页
摘要: 题目地址:http://poj.org/problem?id=2392题目大意:有一头奶牛要上太空,他有很多种石头,每种石头的高度是hi,但是不能放到ai之上的高度,并且这种石头有ci个将这些石头叠加起来,问能够达到的最高高度。解题思路:先将石头可以放置的最大高度按从小到大的顺序进行排序,因为只有先放置最大高度最低的才能得到最优解,也就是说让一种石头尽可能高的放。最大值必须初始化为0,因为存在高度为0的情况。#include#include#includeusing namespace std;int dp[400005];struct node{ int h,a,c; bool operat 阅读全文
posted @ 2012-08-18 17:09 一生挚爱 阅读(203) 评论(0) 推荐(0)
摘要: 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2639第K优解问题其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。如果要求第K优解,那么状态f[i][v]就应该是一个大小为K的数组f[i][v][1..K]。其中f[i][v][k]表示前i个物品、背包大小为v时,第k优解的值。 “f[i][v]是一个大小为K的数组”这一句,熟悉C语言的同学可能比较 阅读全文
posted @ 2012-08-18 10:55 一生挚爱 阅读(144) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2955题目大意:有一个小偷要偷银行的钱,可是他偷没家银行总是有一定的概率被抓,现在给了你一个概率P,只要他被抓的概率乘积不大与P,他就是安全的。问你在他安全的情况下,他最多可以偷多少钱。容量为银行钱的总和,价值就是偷到的钱,花费就是被抓的概率。dp方程:dp[j] = Max(dp[j],dp[j-w[i]]*(1-p[i])) #include#include#includeint w[101];float dp[10005];int main(){ int t,n,i,j,sum; float p, 阅读全文
posted @ 2012-08-17 20:04 一生挚爱 阅读(152) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2159二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设这两种代价分别为代价1和代价2,第i件物品所需的两种代价分别为a[i]和b[i]。两种代价可付出的最大值(两种背包容量)分别为V和U。物品的价值为w[i]。简单二维费用背包问题,解题源代码及注释如下:#include#includeint a[100],b[100],dp[1001][1001];int main(){ i 阅读全文
posted @ 2012-08-16 08:55 一生挚爱 阅读(126) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2844本题为简单多重背包,解题源码及注释如下:#include#includeint w[101],c[101],dp[100100];int max(int a,int b){ return a > b ? a : b;}int main(){ int n,m,num; int i,j,k; while(scanf("%d%d",&n,&m) != EOF && (m||n)) { for(i = 0; i m)//完全背包 { for(j = 阅读全文
posted @ 2012-08-15 20:11 一生挚爱 阅读(198) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1171本题为一个简单的多重背包问题。解题源码及注释:#include#includeint max(int a,int b){ return a > b ? a : b;}int main(){ int N,sum,V,i,j,k; int w[51],n[51];//w[i]用来保存第i件物品的价值,此题中费用与同一物品的价值相等,n[i]用来保存第i件物品的数量 int dp[250000];//总价值最大为250000 while(scanf("%d",&N) , 阅读全文
posted @ 2012-08-15 16:23 一生挚爱 阅读(105) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1162#include#includebool P[110];//标记数组,标记某一个点是否已经连接到树上struct point{ double x,y;}Point[110],A[110];double SegLen(point a,point b){ return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}int main(){ int n,i,num,j; int Min; //Min表示第Min个点到已经连接... 阅读全文
posted @ 2012-08-09 16:13 一生挚爱 阅读(147) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=3371解题思路:题目要我们在已经有的一部分点相连的情况下求最小生成树。首先用并查集将所有城市分离成一个独立的点然后用已经存在的路去连接一部分点,使其构成一棵树,然后用Kruskal 算法 贪心求出最小生成树。实现代码如下:#include #include struct road { int x,y; int w; }a[25010]; int per[510]; int cmp(const void *a,const void *b) { if(((ro... 阅读全文
posted @ 2012-08-09 15:24 一生挚爱 阅读(170) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.html一开始看到题目的时候就知道是求最小生成树的题目,而且可以用并查集了构建树,但是不知道怎么将并查集和求最小生成树的算法结合起来,后来看到了最小生成树Kruskal算法是用贪心求最小生成树的,每次都都取权值最小的边去构建树,如果两点的祖先结点相同,及直接连通或者间接连通的时候则不再建边否则创建边使连点直接或间接连通。实现算法如下:#include#include#include#define MA 阅读全文
posted @ 2012-08-09 09:44 一生挚爱 阅读(199) 评论(0) 推荐(0)
摘要: 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1166基维百科:http://zh.wikipedia.org/wiki/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84http://duanple.blog.163.com/blog/static/7097176720081131113145832/树状数组源码及部分注释:#include#include#define MAX 50010int N;int per[MAX],C[MAX];int lowbit(int n){//此函数实际就是将n的二进制表示形式留下最右边的1 阅读全文
posted @ 2012-08-08 20:32 一生挚爱 阅读(153) 评论(0) 推荐(0)
上一页 1 ··· 6 7 8 9 10 11 12 下一页