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 }