zoukankan      html  css  js  c++  java
  • 2016级算法第三次上机-D.双十一的抉择

    915 双十一的抉择

    思路

    中等题。简化题目:一共n个数,分成两组,使得两组的差最接近0,就是说要使两组数都尽可能的接近sum/2。

    思路还是很混乱的,不知道如何下手,暴力也挺难的,还不能保证对。想一想,从一堆数中取出一些使得和尽可能接近sum/2,把sum/2当作背包总体积,每个数字当作每件物品的体积,价值都是为1,求的就是最大价值。完完全全的01背包问题,问题解决,具体可见参考代码。

    这里就不再详细讲解01背包了,请仔细研读《背包九讲》,务必学习到经典DP问题之背包问题的精髓。

    分析

    01背包的时间复杂度是 (O(V*N))

    参考代码

    //
    // Created by AlvinZH on 2017/10/24.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <cstdio>
    #include <cstring>
    
    int n, sum;
    int V;//背包体积
    int N[1005];//把数量同时看作物品的体积和价值
    int dp[50005];
    
    int main()
    {
        while(~scanf("%d", &n))
        {
            sum = 0;
            memset(dp, 0, sizeof(dp));
            for (int i = 1; i <= n; ++i) {
                scanf("%d", &N[i]);
                sum += N[i];
            }
    
            V = sum / 2;//背包的体积
            //01背包
            for (int i = 1; i <= n; ++i) {
                for (int j = V; j >= N[i]; --j) {
                    int temp = dp[j - N[i]] + N[i];
                    if(dp[j] < temp) dp[j] = temp;
                }
            }
    
            if(sum - 2 * dp[V] == 0) printf("GF&SI
    ");
            else printf("%d
    ", sum - 2 * dp[V]);
        }
    }
    
    /* 分析:一共n个数,分两组,使得两组的差最接近0,就是说要使两组数都尽可能的接近sum/2。
     * 很自然的想到这是在类似于取东西,看怎么取得平均。
     * 所以只需要对一组进行求算使它最接近sum/2,那样的话另一组自然也是最接近的。
     * 典型的01背包问题,sum/2作为背包总体积,每袋糖数量作为价值和体积,求最多可以装多少。
     */
    
  • 相关阅读:
    EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值
    js表单插件
    前端模块化入门
    前端模板引擎
    量化策略研究员
    量化策略研究员
    C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法
    一月5日
    一月5日
    一月5日
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/7977888.html
Copyright © 2011-2022 走看看