题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1171

题意

老师有一个属性:价值(value)。在学院里的老师共有n种价值,每一种价值value对应着m个老师,说明这m个老师的价值都为value。现在要将这些老师从人数上平分成两个院系,并且希望平分后两个院系老师的总价值A和B应尽可能地相等,求A和B的值(A>=B)。

思路

由于每种老师的个数是有限的,所以使用多重背包解决。由于测试数据不是很严格,所以使用01背包也可以通过。

代码

01背包:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6.  
  7. const int N = ;
  8. const int M = * ;
  9. int v[N];
  10. int dp[M];
  11.  
  12. int main()
  13. {
  14. //freopen("hdoj1171.txt", "r", stdin);
  15. int n;
  16. while (cin >> n && n >= )
  17. {
  18. int cur = ; //记录教师总数
  19. int sum = ; //记录教师总价值
  20. for (int i = ;i < n; i++)
  21. {
  22. int val, m;
  23. cin >> val >> m;
  24. for (int j = ; j < m; j++)
  25. {
  26. v[cur++] = val;
  27. sum += val;
  28. }
  29. }
  30.  
  31. memset(dp, , sizeof(dp));
  32. for (int i = ; i < cur; i++)
  33. {
  34. for (int j = sum / ; j >= v[i]; j--)
  35. dp[j] = max(dp[j], dp[j - v[i]] + v[i]); //weight和value相同
  36. }
  37. //由于dp[sum/2]<sum/2,所以dp[sum/2]一定是较小者,sum - dp[sum / 2]是较大者
  38. cout << sum - dp[sum / ] << " " << dp[sum / ] << endl;
  39. }
  40. return ;

多重背包:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6.  
  7. const int N = ;
  8. const int M = * ;
  9. int v[N], num[N];
  10. int dp[M];
  11. int sum;
  12.  
  13. void zero_one_pack(int weight, int value, int capacity)
  14. {
  15. for (int i = capacity; i >= weight; i--) //逆序
  16. dp[i] = max(dp[i], dp[i - weight] + value);
  17. }
  18.  
  19. void complete_pack(int weight, int value, int capacity)
  20. {
  21. for (int i = weight; i <= capacity; i++) //正序
  22. dp[i] = max(dp[i], dp[i - weight] + value);
  23. }
  24.  
  25. void mutiple_pack(int weight, int value, int amount, int capacity)
  26. {
  27. if (weight*amount >= capacity)
  28. complete_pack(weight, value, capacity);
  29. else
  30. {
  31. int k = ;
  32. while (k <= amount)
  33. {
  34. zero_one_pack(weight*k, value*k, capacity);
  35. amount -= k;
  36. k *= ;
  37. }
  38. zero_one_pack(weight*amount, value*amount, capacity);
  39. }
  40.  
  41. }
  42.  
  43. int main()
  44. {
  45. //freopen("hdoj1171.txt", "r", stdin);
  46. int n;
  47. while (cin >> n && n >= )
  48. {
  49. sum = ;
  50. for (int i = ; i <= n; i++)
  51. {
  52. cin >> v[i] >> num[i];
  53. sum += v[i] * num[i];
  54. }
  55.  
  56. memset(dp, , sizeof(dp));
  57. for (int i = ; i <= n; i++)
  58. mutiple_pack(v[i], v[i], num[i], sum / );
  59.  
  60. cout << sum - dp[sum / ] << " " << dp[sum / ] << endl;
  61. }
  62. }

hdoj1171 Big Event in HDU(01背包 || 多重背包)的更多相关文章

  1. 杭电1171 Big Event in HDU(母函数+多重背包解法)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. dp--01背包,完全背包,多重背包

    背包问题 以下代码 n是物品个数,m是背包容积 物品价值和重量int v[maxn],w[maxn]; 01背包 模板 for(int i = 0; i < n; i++) { for(int ...

  3. hdu 1171 Big Event in HDU (01背包, 母函数)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  5. hdu1171Big Event in HDU(01背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...

  7. hdu 1963 Investment 多重背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1963 //多重背包 #include <cstdio> #include <cstr ...

  8. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

  9. HDU 1059(多重背包加二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others)    Me ...

随机推荐

  1. supervisor自启动

    supervisor自启动 其实自启动,也就是在主机开启的时候,执行了sudo supervisord -c /etc/supervisord.conf: 创建/usr/lib/systemd/sys ...

  2. CF869 C 组合

    先吐槽下,题面套的物语系列欸.. 由于距离为3,那么必定两种颜色间要填入第3种颜色,否则就是单独点的情况,那么两两之间可以单独考虑而不影响答案,枚举两种颜色之间边数,计算一边的组合和另一边的排列,最后 ...

  3. Error: Target id is not valid ABIs: no ABIs 解决方法

    问题展示:  没有ABI(Application Binary Interface)应用程序二进制接口 解决方法: 因为Android4.0以上版本Android SDK 初始安装时是不带ABIs的, ...

  4. 【学习DIV+CSS】1. 你必须知道的三个知识

    1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...

  5. linux命令-grep+正则表达式用法

    目标文件/etc/passwd,使用grep命令或egrep 1.显示出所有含有root的行:egrep 'root' passwd 2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的 ...

  6. JS设计模式——7.工厂模式(示例-RSS阅读器)

    RSS阅读器 由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中. 使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起 ...

  7. Spring笔记13--SSH--全注解开发

    SSH全注解开发: (1) 在Action类中添加注解,实现Struts2的注解开发(@NameSpace.@ParentPackage.@Action...) package com.tongji. ...

  8. mini2440的程序下载

    mini2440拿到手有四天了,抱着很大的兴趣看韦东山老师的视频,但是因为电脑是win7 64bit的系统,dnw的驱动没有,经查询可以使用supervivi,就查找相关的资料.但是始终弄不好,后来使 ...

  9. NuGet套件还原步骤(以vs2012为例)

    下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...

  10. python logging 日志

    logging与print 区别,为什么需要logging? 在写脚本的过程中,为了调试程序,我们往往会写很多print打印输出以便用于验证,验证正确后往往会注释掉,一旦验证的地方比较多,再一一注释比 ...