zoukankan      html  css  js  c++  java
  • HDU 1171

    题意:HDU 要分为两个系,要求设备尽可能的平分、并且要求输出的A和B A>=B

    思路:变相的01背包、时间限制有5s,所以可以将所有设备一个一个存到数组里面去、也就是化为01背包问题、每一件物品只有拿和不拿两种状态

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<iostream>
     6 using namespace std;
     7 const int qq=500000+50;
     8 int dp[qq],v[qq];
     9 int main()
    10 {
    11     int n;
    12     while(~scanf("%d",&n)&&n>=1){    //出循环的条件是n为负数、- -我以为是-1 WA了3发 
    13         memset(dp,0,sizeof(dp));
    14         int a,b;int count=0;
    15         int sum=0;
    16         for(int i=0;i<n;++i){
    17             scanf("%d%d",&a,&b);
    18             sum+=a*b;
    19             while(b--)
    20                 v[count++]=a;
    21         }
    22     //    printf("%d
    ",sum/2);    
    23         for(int j,i=0;i<count;++i)
    24             for(j=sum/2;j>=v[i];--j)    //sum/2这个值可能是个小数、但sum/2的结果一定是个整数 
    25                 dp[j]=max(dp[j],dp[j-v[i]]+v[i]);    //所以sum/2其实是小于等于其真实值的、 
    26         printf("%d %d
    ",sum-dp[sum/2],dp[sum/2]);
    27     }
    28     return 0;
    29 } 
  • 相关阅读:
    sql事务
    连续按两次提示退出功能
    页面跳转及传值
    TextView详解
    textAppearance的属性设置
    POJ-1459 Power Network
    POJ-2112 Optimal Milking
    POJ-1149 PIGS
    AOJ-722 发红包
    HDU-3605 Escape
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5352857.html
Copyright © 2011-2022 走看看