• 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;
    }
    View Code
  • 相关阅读:
    ReentrantLock与Condition构造有界缓存队列与数据栈
    ReentrantLock
    文件下载
    scala初学
    bootstrap table 显示连续序号,分页有效
    web中servletcontext和applicationContext
    checkbox是否选中判断
    bookstrap form表单简单-smart-form
    charts柱状图,定时刷新
    js对象和json的区别
  • 原文地址:https://www.cnblogs.com/Houheshuai/p/3851627.html
Copyright © 2020-2023  润新知