标签:style blog http color os 数据
假设所有西瓜重 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; }
标签:style blog http color os 数据
原文地址:http://www.cnblogs.com/Houheshuai/p/3851627.html