首页 > 代码库 > NY 325 zb的生日
NY 325 zb的生日
假设所有西瓜重 Asum,所求的是用 Asum / 2 的背包装,最多装下多少。
刚开始用贪心作的,WA。后来用01背包,结果TLE,数据太大。原来用的是深搜!
dfs(int sum, int i) 表示当前装已了 sum,对第 i 个进行决策。
用时1200多MS,不知道大牛们60MS是怎么搞的,泥煤,20倍!以后再优化吧。
代码如下:
#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>using namespace std;int a[25], Asum, mi;void dfs(int sum, int i){ if(i < 0) //西瓜已经试装完,返回 return; int t = fabs(Asum - 2 * sum); //两兄弟所分西瓜重量之差 if(t < mi) mi = t; if(2 * sum - Asum >= mi) //剪枝,重量之差已大于或等于已求最小值,往后再搜还是大于或等于 return; dfs(sum + a[i], i - 1); //装第 i 个 dfs(sum, i - 1); //不装第 i 个}int main(){ int n; while(scanf("%d", &n) != EOF) { Asum = 0; mi = 99999999; for(int i = 0; i < n; i ++) { scanf("%d", &a[i]); Asum += a[i]; } dfs(0, n - 1); //从什么都不装,对最后一个西瓜决策开始 cout <<mi <<endl; } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。