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月前
|
算法 测试技术 C++
【数位dp】【动态规划】C++算法:233.数字 1 的个数
【数位dp】【动态规划】C++算法:233.数字 1 的个数
|
7月前
|
算法
【算法】—— 简单多状态 dp 问题
【算法】—— 简单多状态 dp 问题
|
7月前
|
算法 测试技术 C#
【数位dp】【C++算法】600. 不含连续1的非负整数
【数位dp】【C++算法】600. 不含连续1的非负整数
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
157 0
|
2月前
|
算法 C++
【算法】DP背包问题(C/C++)
【算法】DP背包问题(C/C++)
|
2月前
|
人工智能 算法 BI
【算法】 线性DP(C/C++)
【算法】 线性DP(C/C++)
|
6月前
|
算法
【算法优选】 动态规划之简单多状态dp问题——贰
【算法优选】 动态规划之简单多状态dp问题——贰
|
6月前
|
算法
【算法优选】 动态规划之两个数组dp——壹
【算法优选】 动态规划之两个数组dp——壹
|
7月前
|
算法 JavaScript
算法(分治、贪心、dp、回溯、分支限界)总结
算法(分治、贪心、dp、回溯、分支限界)总结
|
7月前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)