zoukankan      html  css  js  c++  java
  • hdu 1171

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    using namespace std;
    const int maxn = 250000;
    long long dp[255555];
    long long val[5005];
    long long m[55];
    long long v[55];
    long long lim;
    int main()
    {
        long long n,i,j,l;
        long long a,b;
        while(~scanf("%lld",&n) && n > 0)
        {
            l = 0;
            lim = 0;
            memset(dp, 0, sizeof(dp));
            for(i=1; i<=n; ++i)
            {
                scanf("%lld%lld",&a,&b);
                while(b--)
                {
                    val[l++] = a;
                    lim += a;
                }
            }
            for(i=0;i<l;++i)
            {
                for(j=lim/2; j>= val[i]; --j)
                {
                    dp[j] = max(dp[j],dp[j-val[i]]+val[i]);
                }
            }
            long long k = dp[lim/2];
            printf("%lld %lld
    ",lim-k,k);
        }
    }

    问题描述
    如今,我们都知道计算机学院是HDU最大的部门。但是,也许你不知道计算机学院在2002年曾经被分为计算机学院和软件学院。
    拆分绝对是HDU中的一件大事!同时,这也是一件麻烦事。所有设施都必须减半。首先,评估所有设施,如果两个设施具有相同的价值,则认为两个设施相同。假定有N(0 <N <1000)种设施(不同的价值,不同的种类)。
     

    输入
    输入包含多个测试用例。每个测试用例都以数字N开始(0 <N <= 50 - 不同设施的总数)。接下来的N行包含一个整数V(0 <V <= 50 - 设施值)和一个整数M(0 <M <= 100 - 对应的设施数量)。你可以假设所有的V都不相同。
    以负整数开始的测试用例会终止输入,并且不会处理该测试用例。
     

    产量
    对于每种情况,打印一行包含两个整数A和B,分别表示计算机学院和软件学院的价值将分别得到。 A和B应该尽可能相等。同时,你应该保证A不小于B.
     

    示例输入
    2
    10 1
    20 1
    3
    10 1
    20 2
    30 1
    -1
     

    示例输出
    20 10
    40 40
     

    就是01背包

  • 相关阅读:
    要搜索内容
    .net core 过滤器
    C# => 写法
    js 数组的forEach 函数
    .net core 下载文件 其他格式
    win10 1903 更改文字大小
    fetch 写法
    C# 匿名对象 增加属性
    ping —— 虚拟机
    selenium验证车贷计算器算法
  • 原文地址:https://www.cnblogs.com/mltang/p/8798038.html
Copyright © 2011-2022 走看看