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 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
随机推荐
- 《CCNA(640-802)全套课程讲义》笔记
路由器: CLI(命令行界面)形式相对应的是GUI (图形用户界面) DTE:数据终端设备,指的是位于用户网络接口的用户端设备,通常情况下,路由器端为DTE端. DCE:数据通讯设备,为通信提供时钟 ...
- printf家族探秘
有一个函数,是我们从学习c语言就开始的第一天就接触的,那就是printf函数,可是这个家族的函数,带给我们的便利却不是一点半点,所以写一篇用法总结. 1.printf函数 格式化输出,可以输出八进制, ...
- js 笔记 数组(对象)
一.javascript push 的元素为指针 var data = {"test":{"201308":"23","20130 ...
- 对象的操作-javascript
任务要求: 每单机一下div,边框各加5px,且会红色跟黑色相互交替. 学习总结: 主要是学习到了parseInt这个函数.主要是将本身设置好的长宽然后再加5像素的时候需要用到该函数.如果直接加不使用 ...
- Hadoop的集群和优化
Hadoop的集群和优化 Hadoop集群规模小到几个节点就可以组件一个集群,大到由几千个节点组成的超大集群. 在安装Hadoop集群时,把要安装的软件解压到集群内的所有机器上,软件的安装目录也要一致 ...
- Hibernate- QBC离线查询
package com.gordon.test; import java.util.List; import org.hibernate.Criteria; import org.hibernate. ...
- 腾讯云 Linux 挂载数据盘
查看已挂载的硬盘 1) 运行fdisk -l命令查看硬盘信息. 硬盘从未进行初始化时,需要先创建文件系统, 硬盘格式化 运行mkfs.ext4 device_n ...
- 使用伪hash降低索引长度
理想的索引 1:查询频繁 2:区分度高 3:长度小 4: 尽量能覆盖常用查询字段. 1: 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多). 针对列中的值,从左往 ...
- r函数知识总结
1. rbind(), cbind(): 构造.合并vector 或matrix为一个矩阵:cbind(1, 1:10) ----默认列合并, rbind(1, 1:10) ----行合并(or构造 ...
- 表单提交 多个name相同的input
<form action="{:U('Index/test')}" method="post"> <foreach name="di ...