上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 26 下一页
摘要: 题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数.......思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的。反思:这个题目我wa两次,是应为我把判断cash==0||n==0放得太前,以致于后面的数据木有输入wa代码:#include#include#includeusing namespace std;int dp[110000],t[30000],s[2000][2];int main(){ int cash,n; while(scanf("%d%d",&cash,&n)>0) 阅读全文
posted @ 2013-07-26 12:19 紫忆 阅读(2071) 评论(0) 推荐(0) 编辑
摘要: 水题........#include#include#includeusing namespace std;int s[2000][2],dp[150],t[150][3];int main(){ int text; scanf("%d",&text); while(text--) { int n,m; scanf("%d %d",&n,&m); for(int i=1;i0) { s[cnt][0]=k*t[i][0]; s[cnt++][1]=... 阅读全文
posted @ 2013-07-26 12:11 紫忆 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个。求能否找到满足价值刚好是所有的一半的方案。思路:简单的多重背包,我建议多重背包都用二进制拆分优化下........#include#include#includeusing namespace std;int dp[200000],w[200000];int main(){ int t[7],text=0; while(1) { int sum=0; for(int i=1;i0) { w[c... 阅读全文
posted @ 2013-07-26 12:09 紫忆 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 题目很水,不多说.........#includeint main(){ long t,n,m,a,i,j,dp[10005],vol[505],jizhi[505],sum,w; scanf("%ld",&t); while(t--) { w=0; scanf("%ld%ld",&n,&m); sum=m-n; scanf("%ld",&a); for(i=0;idp[j-vol[i]]+jizhi[i]) dp[j]=dp[j-vol[i]]+jizh... 阅读全文
posted @ 2013-07-26 12:03 紫忆 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题意:求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币。注意:每一年收到的利息都可以作为下一年的本金......其实从测试数据来看,是很好看出来的......思路:将每一年的“体积”加上利息就好,当然,数据太大,可以除以100减少时间和空间复杂度......反思:很想说,这些我都想到了,但是还是wa了两次,是因为数据溢出的原因......以前就遇到这样的原因,木有想到这次我注意了,但还是出问题了......wa代码:#include#include#includeusing namespace std;int dp[500000],s[100][2];int 阅读全文
posted @ 2013-07-25 12:19 紫忆 阅读(697) 评论(0) 推荐(0) 编辑
摘要: 题意:有四种硬币,1分,5分,10分,25分,分别有a,b,c,d种,给出一个n分钱,要求你求出组成n分钱最多需要的硬币数量,并且输出组成它的各种硬币的数量......学到的东西:这个题目我是用两种方法做的,一个是完全背包,一个是多重背包。做完这个题目,我对背包的理解可以说上了个层次......还有记录路径的方法,反过来求出各个硬币的数量,都是我以前做的题目没有涉及到的.......要求出各个硬币有多少种,只需要记录路径,在开一个数组统计p-path[p],为什么可以如此?很容易想到path[p]=p-v[i]如此,p-path[p]==p-(p-v[i])==v[i],而v[i]正好是硬币的 阅读全文
posted @ 2013-07-24 17:47 紫忆 阅读(2490) 评论(0) 推荐(0) 编辑
摘要: 这个题目要用到大数的加法,其他的,我没有感觉到有什么难想的......比较水的背包题,掠过.....#include#include#includeusing namespace std;int s[2000][2],dp[150],t[150][3];int main(){ int text; scanf("%d",&text); while(text--) { int n,m; scanf("%d %d",&n,&m); for(int i=1;i0) { s[cnt][0]=k*t[i][0]; s[cnt++][1]=k* 阅读全文
posted @ 2013-07-24 17:22 紫忆 阅读(1057) 评论(0) 推荐(0) 编辑
摘要: 题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。mark:又是变种01背包,每做一个变种的,就是一种提高。。按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。#include#include#includeusing namespace std;const int MAXN=5005;int dp[MAXN];struct Node{ int p,q,v;}node[505];bool cmp(Node a,Node b){ return (a.q-a.p)=node[i].p;j--) ... 阅读全文
posted @ 2013-07-21 21:07 紫忆 阅读(729) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2639题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混起来,它第一行是价值,再是体积)思路:首先dp[i][j]代表的是在体积为i的时候第j优解为dp[i][j]......那么,我们就可以这样思考,i对应体积,那么如果只是一维的dp[i],代表的应该是体积为i时的最大值,那么同理,dp[i][1]代表的是体积为i时的最大值,那么我们就可以退出两种动态,dp[i][m],dp[i-s[i][0]][m]+s[i][1].....然后把这两种状态开个两个 阅读全文
posted @ 2013-07-21 20:03 紫忆 阅读(1961) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2184题意:给定两个属性,求这两个属性的和的最大值.........思路:将第一个属性往后平移1000个单位,然后推导其动态转移方程,若是dp[i],代表当加入第一个属性加到i时,符合题意的第二个属性的最大值......题意是两个属性的和的最大值,那么动态转移方程必然不是dp[j]=max(dp[j],dp[j-s[i][0]]+s[i][1]),因为这个动态转移方程固然可以求出第二个属性的最大值,但别忘了题意要求第一个属性与第二个属性的和的最大值,那么,第一个属性平移了1000个单位,在考虑动态转移时,是必须要将这个考虑进去的。可以开一个 阅读全文
posted @ 2013-07-21 11:15 紫忆 阅读(1050) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 26 下一页