InputInput contains multiple test cases. Each test case starts with a number N (0 < N <= 50 -- the total number of different facilities). The next N lines contain an integer V (0<V<=50 --value of facility) and an integer M (0<M<=100 --corresponding number of the facilities) each. You can assume that all V are different.
A test case starting with a negative integer terminates input and this test case is not to be processed.
OutputFor each case, print one line containing two integers A and B which denote the value of Computer College and Software College will get respectively. A and B should be as equal as possible. At the same time, you should guarantee that A is not less than B.
Sample Input
2 10 1 20 1 3 10 1 20 2 30 1 -1
Sample Output
20 10 40 40
题意:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近 并且A的价值不能小于B
思路:将总和平分后,就是一道01背包题了 (之前的思路是将物品的数目折半 一直没想出来 后来在同学的提醒下把总价值折半 就很好做了) 值得注意的是 因为A大于B 所以先输入总和减去背包容量(因为背包不一定装满)
#include <bits/stdc++.h> using namespace std; int v[10001]; int main() { int n; while(cin>>n,n>0) { memset(v,0,sizeof(v)); int sum=0,ans=0,maxsum=-100000,k=1,st,en; for(int i=0;i<n;i++) { cin>>v[i]; if(v[i]<0) sum++; } for(int i=0;i<n;i++) { ans+=v[i]; if(maxsum<ans) { maxsum=ans; en=i; st=k; } if(ans<0) { ans=0; k=i+1; } } if(sum==n) { cout<<"0"<<" "<<v[0]<<" "<<v[n-1]<<endl; } else if(n==1) { cout<<v[0]<<" "<<v[0]<<" "<<v[0]<<endl; } else { cout<<maxsum<<" "<<v[st]<<" "<<v[en]<<endl; } } return 0; }
H - Big Event in HDU <HDU 1171>
原文:https://www.cnblogs.com/xuxua/p/9275474.html