POJ 1837 Balance(01背包变形, 枚举DP)
Q: dp 数组应该怎么设置?
A: dp[i][j] 表示前 i 件物品放入天平后形成平衡度为 j 的方案数
题意:
有一个天平, 天平的两侧可以挂上重物, 给定 C 个钩子和G个秤砣.
2 4
-2 3
3 4 5 8
C = -2, G = 3, 那么
2*(3+4+5)=3*(8); 2*(4+8)=3*(3+5)
共有两种可行的方案, 那么结果就是2
Description
It orders two arms of negligible weight and each arm's length is 15. Some hooks are attached to these arms and Gigel wants to hang up some weights from his collection of G weights (1 <= G <= 20) knowing that these weights have distinct values in the range 1..25. Gigel may droop any weight of any hook but he is forced to use all the weights.
Finally, Gigel managed to balance the device using the experience he gained at the National Olympiad in Informatics. Now he would like to know in how many ways the device can be balanced.
Knowing the repartition of the hooks and the set of the weights write a program that calculates the number of possibilities to balance the device.
It is guaranteed that will exist at least one solution for each test case at the evaluation.
Input
• the first line contains the number C (2 <= C <= 20) and the number G (2 <= G <= 20);
• the next line contains C integer numbers (these numbers are also distinct and sorted in ascending order) in the range -15..15 representing the repartition of the hooks; each number represents the position relative to the center of the balance on the X axis (when no weights are attached the device is balanced and lined up to the X axis; the absolute value of the distances represents the distance between the hook and the balance center and the sign of the numbers determines the arm of the balance to which the hook is attached: '-' for the left arm and '+' for the right arm);
• on the next line there are G natural, distinct and sorted in ascending order numbers in the range 1..25 representing the weights' values.
Output
Sample Input
2 4
-2 3
3 4 5 8
Sample Output
2
思路:
1. 令 dp[i][j] 表示将第 I 件物品放入天平后, 平衡度为 j 的方案数, 平衡度可能为负, 可加入偏移使其总是正数
2. dp[i][v+w[i]*h[j]] += dp[i-1][v]
总结
1. 按照黑书的划分, 这道题既是把问题看成多阶段的决策过程, 也是利用记忆化搜索解决重叠子问题
2. 本打算使用滚动数组来做, 后来发现滚动数组难以初始化, 就作罢了
3. 代码第二层循环, v 的取值范围. 因为 dp[0][shift] = 1 保证以后的 v+c[i]*g[i] 不会出现小于 0 的情况发生. 因为 shift = 7500, 最大能偏 7500. 我最初理解错误, 以为 需要通过设置 v 的取值范围才能保证 v 不为负. 其实只要设置 dp[0][shift] 就足够了
代码:
#include <iostream>
using namespace std; const int shift = 7500;
int C, G;
int c[21], g[21];
int dp[21][25000]; int solve_dp() {
memset(dp, 0, sizeof(dp));
dp[0][shift] = 1;
for(int i = 1; i <= G; i++) {
for(int v = 0; v<= 2*shift; v++) {
if(dp[i-1][v])
for(int j = 0; j < C; j++) {
dp[i][v+c[j]*g[i]] += dp[i-1][v];
printf("dp[%d][%d] = %d\n",i, v+c[j]*g[i]-7500,dp[i][v+c[j]*g[i]]);
}
}
}
return dp[G][shift];
} int main() {
freopen("E:\\Copy\\ACM\\测试用例\\in.txt", "r", stdin);
cin >> C >> G;
for(int i = 0; i < C; i ++)
scanf("%d", &c[i]);
for(int i = 1; i <= G; i ++)
scanf("%d", &g[i]);
// mainfcun
cout << solve_dp() << endl;
return 0;
}
update 2014年3月14日14:59:57
再次做, 仍然毫无思路
本体的所有难点都在动态规划的设计上, dp[][] 并不是方案数, 而是放入第 i 个秤砣后的平衡系数
POJ 1837 Balance(01背包变形, 枚举DP)的更多相关文章
- POJ 1837 Balance 01背包
题目: http://poj.org/problem?id=1837 感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇.. #include < ...
- POJ 2923 Relocation(01背包变形, 状态压缩DP)
Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...
- POJ 1837 -- Balance(DP)
POJ 1837 -- Balance 转载:優YoU http://user.qzone.qq.com/289065406/blog/1299341345 提示:动态规划,01背包 初看此题第 ...
- FZU 2214 Knapsack problem 01背包变形
题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- CF#214 C. Dima and Salad 01背包变形
C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
随机推荐
- 对JAVASCRIPT匿名函数的理解
网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点 Query片段: (function(){ //这里忽略jQuery所有实现 })(); 要说匿名函数,我们首先要由函数本身说起. ...
- org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xm
org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xm 检查jar包是否正确以及配置的xm ...
- C#集合概述
C#集合概述 2016-11-29 集合 顺序排列 连顺存储 直接访问方式 访问时间 操作时间 备注 Dictionary 是 Key Key:O(1) O(1) 访问性能最快,不支持排序 Sorte ...
- Hive调优实战[转]
Hive优化总结 [转自:http://sznmail.iteye.com/blog/1499789] 优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoo ...
- Extjs combox的异步加载
很多朋友用 extjs 很多时候都要用到combo 而异步加载是用的最多的 今天我就举一个例子 了解combo的异步加载 Ext.onReady(function () { Ext.BLANK_IM ...
- Linux Shell sort排序常用命令(转载)
转载自:http://blog.csdn.net/monkeyduck/article/details/10097829 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则 ...
- 创建Ajax对象
针对不同版本浏览器插件Ajax对象. <script> function createAjax(){ var request=false; //window对象中有XMLHttpReque ...
- Wordpress搭建社交型小游戏网站10大步骤
http://www.aliyun.com/zixun/content/2_8_196141.html ———————————————————————————————————————————————— ...
- 使用伪hash降低索引长度
理想的索引 1:查询频繁 2:区分度高 3:长度小 4: 尽量能覆盖常用查询字段. 1: 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多). 针对列中的值,从左往 ...
- r指定位置插入一列数值
y<-1:4 data1 <-data.frame(x1=c(1,3,5,7), x2=c(2,4,6,8),x3=c(11,12,13,14),x4=c(15,16,17,18)) da ...