hdoj1171 Big Event in HDU(01背包 || 多重背包)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1171
题意
老师有一个属性:价值(value)。在学院里的老师共有n种价值,每一种价值value对应着m个老师,说明这m个老师的价值都为value。现在要将这些老师从人数上平分成两个院系,并且希望平分后两个院系老师的总价值A和B应尽可能地相等,求A和B的值(A>=B)。
思路
由于每种老师的个数是有限的,所以使用多重背包解决。由于测试数据不是很严格,所以使用01背包也可以通过。
代码
01背包:
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int N = ;
- const int M = * ;
- int v[N];
- int dp[M];
- int main()
- {
- //freopen("hdoj1171.txt", "r", stdin);
- int n;
- while (cin >> n && n >= )
- {
- int cur = ; //记录教师总数
- int sum = ; //记录教师总价值
- for (int i = ;i < n; i++)
- {
- int val, m;
- cin >> val >> m;
- for (int j = ; j < m; j++)
- {
- v[cur++] = val;
- sum += val;
- }
- }
- memset(dp, , sizeof(dp));
- for (int i = ; i < cur; i++)
- {
- for (int j = sum / ; j >= v[i]; j--)
- dp[j] = max(dp[j], dp[j - v[i]] + v[i]); //weight和value相同
- }
- //由于dp[sum/2]<sum/2,所以dp[sum/2]一定是较小者,sum - dp[sum / 2]是较大者
- cout << sum - dp[sum / ] << " " << dp[sum / ] << endl;
- }
- return ;
多重背包:
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int N = ;
- const int M = * ;
- int v[N], num[N];
- int dp[M];
- int sum;
- void zero_one_pack(int weight, int value, int capacity)
- {
- for (int i = capacity; i >= weight; i--) //逆序
- dp[i] = max(dp[i], dp[i - weight] + value);
- }
- void complete_pack(int weight, int value, int capacity)
- {
- for (int i = weight; i <= capacity; i++) //正序
- dp[i] = max(dp[i], dp[i - weight] + value);
- }
- void mutiple_pack(int weight, int value, int amount, int capacity)
- {
- if (weight*amount >= capacity)
- complete_pack(weight, value, capacity);
- else
- {
- int k = ;
- while (k <= amount)
- {
- zero_one_pack(weight*k, value*k, capacity);
- amount -= k;
- k *= ;
- }
- zero_one_pack(weight*amount, value*amount, capacity);
- }
- }
- int main()
- {
- //freopen("hdoj1171.txt", "r", stdin);
- int n;
- while (cin >> n && n >= )
- {
- sum = ;
- for (int i = ; i <= n; i++)
- {
- cin >> v[i] >> num[i];
- sum += v[i] * num[i];
- }
- memset(dp, , sizeof(dp));
- for (int i = ; i <= n; i++)
- mutiple_pack(v[i], v[i], num[i], sum / );
- cout << sum - dp[sum / ] << " " << dp[sum / ] << endl;
- }
- }
hdoj1171 Big Event in HDU(01背包 || 多重背包)的更多相关文章
- 杭电1171 Big Event in HDU(母函数+多重背包解法)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- dp--01背包,完全背包,多重背包
背包问题 以下代码 n是物品个数,m是背包容积 物品价值和重量int v[maxn],w[maxn]; 01背包 模板 for(int i = 0; i < n; i++) { for(int ...
- 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 ...
- HUD 1171 Big Event in HDU(01背包)
Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...
- hdu1171Big Event in HDU(01背包)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...
- hdu 1963 Investment 多重背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1963 //多重背包 #include <cstdio> #include <cstr ...
- hdu 2844 Coins (多重背包+二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...
- HDU 1059(多重背包加二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=1059 Dividing Time Limit: 2000/1000 MS (Java/Others) Me ...
随机推荐
- supervisor自启动
supervisor自启动 其实自启动,也就是在主机开启的时候,执行了sudo supervisord -c /etc/supervisord.conf: 创建/usr/lib/systemd/sys ...
- CF869 C 组合
先吐槽下,题面套的物语系列欸.. 由于距离为3,那么必定两种颜色间要填入第3种颜色,否则就是单独点的情况,那么两两之间可以单独考虑而不影响答案,枚举两种颜色之间边数,计算一边的组合和另一边的排列,最后 ...
- Error: Target id is not valid ABIs: no ABIs 解决方法
问题展示: 没有ABI(Application Binary Interface)应用程序二进制接口 解决方法: 因为Android4.0以上版本Android SDK 初始安装时是不带ABIs的, ...
- 【学习DIV+CSS】1. 你必须知道的三个知识
1. DIV+CSS的叫法不够严谨 我们以前做页面布局的时候大多是用Table,很多人称之为“Table+CSS”,而现在比较流行的是DIV布局,所以称之为“DIV+CSS”.听起来是挺合理的,岂不知 ...
- linux命令-grep+正则表达式用法
目标文件/etc/passwd,使用grep命令或egrep 1.显示出所有含有root的行:egrep 'root' passwd 2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的 ...
- JS设计模式——7.工厂模式(示例-RSS阅读器)
RSS阅读器 由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中. 使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起 ...
- Spring笔记13--SSH--全注解开发
SSH全注解开发: (1) 在Action类中添加注解,实现Struts2的注解开发(@NameSpace.@ParentPackage.@Action...) package com.tongji. ...
- mini2440的程序下载
mini2440拿到手有四天了,抱着很大的兴趣看韦东山老师的视频,但是因为电脑是win7 64bit的系统,dnw的驱动没有,经查询可以使用supervivi,就查找相关的资料.但是始终弄不好,后来使 ...
- NuGet套件还原步骤(以vs2012为例)
下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...
- python logging 日志
logging与print 区别,为什么需要logging? 在写脚本的过程中,为了调试程序,我们往往会写很多print打印输出以便用于验证,验证正确后往往会注释掉,一旦验证的地方比较多,再一一注释比 ...