Big Event in HDU
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 1139 Accepted Submission(s): 444 |
Problem Description Nowadays, we all know that Computer College is the biggest |
Input Input contains multiple test cases. Each test case starts with a |
Output For each case, print one line containing two integers A and B |
Sample Input 2 10 1 20 1 3 10 1 20 2 30 1 -1 |
Sample Output 20 10 40 40 |
Author lcy |
这是一个多重背包的题目(将物品的原价值即为放入背包中物品的价值与花费,因为当不超过背包容量且价值之和最大时,即为不超过背包容量且花费之和最大(花费最接近背包容量),即为这些物品的原价值之和最接近背包容量。此处将物品总价值的一半看为背包容量即可。
这里有一个我见过的最诡异的八阿哥。。。汗。。。
这道题是以负数作为输入的结束标志的,而不只局限于-1, 被惯性思维坑了。。。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int MAXN=250010; 8 const int inf=99999999; 9 int v[MAXN]; 10 int dp[MAXN]; 11 int num[55]; 12 int main() 13 { 14 //freopen("data.in","r",stdin); 15 std::ios::sync_with_stdio(false); 16 std::cin.tie(0); 17 int n; 18 int sum; 19 int cc; 20 while(cin>>n&&n>=0){ 21 sum=0; 22 memset(dp,0,sizeof(dp)); 23 for(int i=0;i<n;i++){ 24 cin>>v[i]>>num[i]; 25 sum+=(v[i]*num[i]); 26 } 27 cc=sum/2; 28 for(int i=0;i<n;i++){ 29 for(int k=0;k<num[i];k++){ 30 for(int j=cc;j>=v[i];j--){ 31 dp[j]=max(dp[j],dp[j-v[i]]+v[i]); 32 } 33 } 34 } 35 cout<<sum-dp[cc]<<" "<<dp[cc]<<endl; 36 } 37 }