上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 26 下一页
摘要: 题意:有0,1,2三种任务,0任务中的任务至少得完成一件,1中的任务最多完成1件,2中的任务随便做。每一个任务最多只能做一次 。n代表有n组任务,t代表有t分钟,m代表这组任务有m个子任务,s代表这m个子任务属于0,1,2中的哪种类型,接下来是m个子任务,第一个数代表要花费的时间,第二个数代表得到的愉悦度......求在可以完成工作的情况的最大愉悦度....要是不能完成,输出-1(题意要求每个子任务只能被取一次)错误思路:我一开始想,把0,1,2这三大组任务的子任务先统计好,在dp的时候,我开dp[3][105],代表在完成3组任务体积为105的情况的最大愉悦度.......这种思路是错的,因 阅读全文
posted @ 2013-07-31 13:31 紫忆 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了。假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。下面一步一步试着找出它。我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。此外,我们用一个变量Len来记录现在最长算到多少了首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时Len=1然后,把d[2]有序地放到B里,令B[1] = 1,就是说长度 阅读全文
posted @ 2013-07-31 10:08 紫忆 阅读(1594) 评论(0) 推荐(0) 编辑
摘要: 题意:有n双鞋子,m块钱,k个品牌,(一个品牌可以有多种价值不同的鞋子),接下来n种不同的鞋子,a为所属品牌,b为要花费的钱,c为所能得到的价值。每种价值的鞋子只会买一双,有个人有个伟大的梦想,每个品牌的鞋子至少买一双,问他这个梦想可以实现不?不可以实现输出Impossible,可以实现输出最大价值......思路:很容易看出来这是个分组背包题,当然这个分组背包有些不同于每组最多取一个的分组背包......但我是觉得,分组背包就这么几种问法吧1、最常见的、最水的,每组最多取1个.........(一般是隐性的,需要自己分析)2、每组至少取1个........(就是本题)3、随意选,可以选,可以 阅读全文
posted @ 2013-07-29 17:12 紫忆 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 题意:有n门课程,和m天时间,完成a[i][j]得到的价值为第i行j列的数字,求最大价值......思路:分组背包,就是第n门课程,可以做一天,可以做两天,但它们相斥,你做了一天,就不能再做一天...也就是不能再做这门课程了......当然这是最多取一个的算法.......#include#include#includeusing namespace std;int dp[150],a[150][150];int main(){ int n,m; while(scanf("%d%d",&n,&m)>0&&(n+m)) { for(int 阅读全文
posted @ 2013-07-29 15:31 紫忆 阅读(3098) 评论(0) 推荐(3) 编辑
摘要: 题意:给你价值为a1,a2.....的货币,每种有c1,c2.......个,求这些货币所能组成的价值小于等于m有多少个.....思路:很像一道多重背包题?那我一开始的确是用多重背包的思路编写的......TLE了,原来其中隐藏着一个被我忽视的一个问题,当ai*ci>=m时,我们没有必要去拆分ci了,就直接把这种情况当作完全背包处理.......#include#include#includeusing namespace std;int dp[100005],t[300][2];int n,m;int sum;void deal1(int x){ for(int j=m;j>=. 阅读全文
posted @ 2013-07-29 14:42 紫忆 阅读(1368) 评论(0) 推荐(0) 编辑
摘要: 题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面......思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制.....一个是人数,一个是体重,再仔细思考下,发现一定要有这么多人,也就是说一定要有总人数除以2这么多人,那么当第n个人存在,第n-1个人必须存在.........#include#include#includeusing namespace std;int dp[55][23000],a[105];int main(){ int n; while(scanf("%d",&n)& 阅读全文
posted @ 2013-07-29 12:58 紫忆 阅读(544) 评论(0) 推荐(0) 编辑
摘要: 题意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0;思路:这个题目可以很明显的看出来,有两个限制条件,必须看m场电影的最大价值........其实我前面在01背包时提过,对于这样的条件,要可以看第n场电影,那么相对应的第n-1场电影必须看了,否则不能进行动态转移.......我的想法是,0代表着这场电影没有看,>0代表这场电影看了。其他的就是动态转移了,很容易得到,dp[i][j]=max(dp[i][j],dp[i-1][j-v[i]]+val[i])...... 阅读全文
posted @ 2013-07-29 12:41 紫忆 阅读(522) 评论(0) 推荐(0) 编辑
摘要: 二维背包问题,我是觉得这个题目数据比较水,虽然它最后说了怪可以无限个,但是它却只能最多杀s个,也就是所有品种的怪最多为s个,那么就是二维完全背包的问题了.......同时,它没有说一定要杀s只怪,所以在初始化全部赋值为0即可.......#include#include#includeusing namespace std;int dp[105][105],t[105][2];int main(){ int n,m,k,s; while(scanf("%d %d %d %d",&n,&m,&k,&s)>0) { for(int i=1; 阅读全文
posted @ 2013-07-29 12:25 紫忆 阅读(844) 评论(0) 推荐(0) 编辑
摘要: 思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......反思:以前写背包,由于只有一个体积,所以习惯性的在for中,就所取的最小值限制,而在这次,因为这里导致wa了,具体是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,它可以不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值........wa代码:#include#include#includeusing namespace std;int dp[105][105][110],s[105][3];int max(int x,int y){ if(x>y) return x; el... 阅读全文
posted @ 2013-07-26 15:10 紫忆 阅读(843) 评论(0) 推荐(0) 编辑
摘要: 题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度.........思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好序了的,总是从小到大,但是这个题目不同,它有着最高高度的限制,那么在思考的时候,要得到最优的,那么首先就是要对ai排序......这是贪心,然后就是多重背包了........#include#include#include#includeusing namespace std;struct node{ int h; int a; int c;}s[500];int dp[50000... 阅读全文
posted @ 2013-07-26 12:44 紫忆 阅读(663) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 15 16 17 ··· 26 下一页