zoukankan      html  css  js  c++  java
  • HDU 1171 (01背包问题)

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1171

    分析:

    例如数据

    3

    10    2

    20    1

    30    1

    获得这样一个降序的数组:30 20 10 10 (两个10是因为10值物品有两个)

    总物品价值的一半为背包容量,然后从价值大的物品开始选,当当前背包中物品价值加上将要放的物品的价值大于背包容量的时候,将要放入背包的物品不放入

    注意点

    1.n为负数的时候停止循环,而不是n==-1

    2.背包容量为有小数的数时,取ceil上极限

    3.数组排序降序,升序的话不好处理数据

    特殊数据

    3

    10    2

    20    1

    21    1

    答案:31    30

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
       int n;
       while(scanf("%d",&n)!=EOF&&n>=0)
       {
           if(n<0)
            break;
           int x,y;
           int q[100005],len=0;
           double sum=0.0,temp=0.0;
           for(int i=0;i<n;i++)
           {
               scanf("%d %d",&x,&y);
               sum=sum+(double)x*y;
               while(y--)
               {
                   q[len++]=x;
               }
           }
           temp=ceil(sum*1.0/2.0);
           sort(q,q+len);
           double a=0.0,b=0.0;
           for(int i=len-1;i>=0;i--)
           {
               if(a+q[i]>temp)
                continue;
               a=a+q[i];
           }
           b=sum-a;
           if(b>a)
           {
               int t=a;
               a=b;
               b=t;
           }
           printf("%.0lf %.0lf
    ",a,b);
       }
    }

    自己还是太菜。。。写了两小时。。。。。。。。

  • 相关阅读:
    md5加密(4)
    生成短的uuid
    九九乘法
    闰年判断
    初识网络传输
    省选模拟77
    省选模拟76
    省选模拟75
    省选模拟74
    省选模拟73
  • 原文地址:https://www.cnblogs.com/yinbiao/p/8870182.html
Copyright © 2011-2022 走看看