Big Event in HDU(dp算法)

简介: Big Event in HDU(dp算法)

题目:

如今,我们都知道计算机学院是HDU最大的部门。但是,也许你不知道计算机学院曾在2002年被分成计算机学院和软件学院。

拆分绝对是HDU中的一件大事!与此同时,这也是一件麻烦事。所有设施必须减半。首先,评估所有设施,如果两个设施具有相同的价值,则认为它们是相同的。假设有N(0 <N <1000)种设施(不同的值,不同的种类)。

输入

输入包含多个测试用例。每个测试用例以数字N开始(0 <N <= 50 - 不同设施的总数)。接下来的N行包含整数V(0 <V <= 50 - 设施值)和整数M(0 <M <= 100 - 相应的设施数)。您可以假设所有V都不同。

以负整数开头的测试用例终止输入,并且不处理该测试用例。

产量

对于每种情况,打印一行包含两个整数A和B,分别表示计算机学院和软件学院的价值。 A和B应尽可能相等。同时,你应该保证A不低于B.Sample Input

2
10 1
20 1
3
10 1 
20 2
30 1
-1

Sample Output

20 10
40 40

解题思路:这个题也是dp中的背包问题,不过拐了一个弯,题目说一共两个学院所获得设施值最好情况是一样,所以每一个学院空间背包就是总资金的一半,因为题目说A>=B,所以求出B所占的最大空间,这样问题就转变为多重背包,一共n种物品,

程序代码:

#include<iostream>
#include<algorithm>
#include<string.h>
int f[50000],v[50000],w[50000];
using namespace std;
int main()
{
  int m,n,sum;
  while(cin>>m)
  {
    memset(f,0,sizeof(f));
    if(m<=0)
      break;
    for(int i=1;i<=m;i++)
      cin>>v[i]>>w[i];
    sum=0;n=0;
    for(int i=1;i<=m;i++)
    {
      sum+=v[i]*w[i];
      n+=w[i];
    }
    int num;  
    num=sum/2;
    for(int i=1;i<=m;i++)//物品的种类
      for(int k=1;k<=w[i];k++)//每一种所有的件数
        for(int j=num;j>=v[i];j--)
          f[j]=max(f[j],f[j-v[i]]+v[i]);//求出最大的B资金
    cout<<sum-f[num]<<" "<<f[num]<<endl;
    
  }
  return 0;
}


相关文章
|
7月前
light oj 1231-1232 - 1233- Coin Change 背包
暂时到半懂不懂也没办法讲明白,就不误人子弟了,直接贴代码了。
21 0
|
Java Python
Leetcode-Medium 494. Target Sum
Leetcode-Medium 494. Target Sum
73 0
|
机器学习/深度学习
POJ 1423 Big Number
POJ 1423 Big Number
83 0
HDOJ 1391 Number Steps(打表DP)
HDOJ 1391 Number Steps(打表DP)
101 0
HDOJ 1391 Number Steps(打表DP)