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\n",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\n",sum-dp[sum/2],dp[sum/2]);
27     }
28     return 0;
29 } 

 

posted @ 2016-04-04 20:49  我不萌、我要高冷  阅读(133)  评论(0编辑  收藏  举报