摘要:
这是一道可以用多重背包来写的题,但是这种方法速度很慢,2829MS。思路很简单,将多重背包转化为01背包,dp所对应的下标为钱数,如果能刚好凑到下标所对应的钱数,就赋为1。最后输出被赋为1的个数就是可能性。#include<stdio.h>#include<string.h>#define MAX_PRICE 1000000#define MAX_COIN 110void mk_list(int,int,int);int top=1,stk[MAX_PRICE];int main(){ int n,m; while(scanf("%d%d",& 阅读全文
posted @ 2012-07-30 23:50
等待电子的砹
阅读(258)
评论(0)
推荐(0)
摘要:
这是一道二维的01背包,开始没有思路,是看了别人的解题报告才有了大方向,再自己写的。但是自己在细节上还是出了许多问题。 dp[][]的两个下表分别表示两条边,如果篱笆的长度刚好等于下标,说明有办法建出这么长的篱笆(比如给了1,3,4可以建成长度为5的篱笆,不能建成长度为6的篱笆),如果能,就将dp赋为1。由于这里是选择单个篱笆的过程,在这个过程中还不能加入判断是否能构成三角形,比如,再选取最后一块篱笆就构成了三角形,但如果在这里就加入判断,会导致选最后一块篱笆之前,不能构成三角形,这时的dp值为0,dp为0应该表示不能建成这么长的篱笆,而不能同时表示能否建成篱笆和能否构成三角形。判断能否... 阅读全文
posted @ 2012-07-30 20:57
等待电子的砹
阅读(612)
评论(0)
推荐(0)
摘要:
这是一道多重背包,加了一点限制条件,要求不能让每一类型的砖头超过该类型的最大高度,这只需要加一个if语句就行了 if(j<=a[i]) dp[j]=max(dp[j],dp[j-hight[i]]+hight[i]) 值得注意的是,应该将每种类型的砖头根据限制高度进行排序,也就是说要先从最大高度小的开始选,比如这种数据:5 10 1;1 1 1;最大高度应该是6,如果不先从小的开始选,那么就会首先取符合要求的5 10 1,但是第二块砖头的限制高度是1,取了第一块砖头之后高度已经是5了,就不能再取1 1 1了。所以要先从最大高度小的开始取。 做这道题的时候,最开始没有想到上面的那... 阅读全文
posted @ 2012-07-30 12:17
等待电子的砹
阅读(167)
评论(0)
推荐(0)
浙公网安备 33010602011771号