zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python -- 初始函数 函数的定义,函数的返回值以及函数的参数
    python 文件操作: 文件操作的函数, 模式及常用操作.
    第三节 深入JavaScript
    第二节 JavaScript基础
    第一节 JavaScript概述
    面试大纲
    flask
    面试准备
    数据结构与算法 学习
    Linux学习
  • 原文地址:https://www.cnblogs.com/Houheshuai/p/3851627.html
Copyright © 2011-2022 走看看