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 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
随机推荐
- ubuntu tftp 配置
1:sudo apt-get install tftp tftpd openbsd-inetd特别指出很多文章里用的是netkit-inetd,但是实际下载时发现这个软件是下不到的,特改用openbs ...
- xml相关术语说明
<project xmlns="http://maven.apache.org/POM/4.0.0" --命名空间,类似包名,因为xml的标签可自定义,需要命名空间来区分x ...
- 替换python字典中的key值
- 一个activity
package com.example.administrator.Activity; import android.content.Context;import android.content.In ...
- perl模块安装——cpanm
下载 wget http://xrl.us/cpanm mv cpanm.1 cpanm 配置 在bashrc或zshrc里面加入下面的几句话 最好把相对路径改成绝度路径(将~换成你根目录的绝对路径 ...
- 【C#/WPF】保存BitmapImage数据到文件中
参考: http://stackoverflow.com/questions/35804375/how-do-i-save-a-bitmapimage-from-memory-into-a-file- ...
- 在Linux下制作一个磁盘文件,在u-boot 阶段对emmc 烧写整个Linux系统方法
在Linux 下制作一个磁盘文件, 可以给他分区,以及存储文件,然后dd 到SD卡便可启动系统. 在u-boot 下启动后可以读取该文件,直接在u-boot 阶段就可以做烧写操作,省略了进入系统后才进 ...
- DataGridView使用技巧十三:点击列头实现升序和降序排序
DataGridView 列有三种排序模式.每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一. Da ...
- r 数据分组处理
一.R语言实现数据的分组求和 实验数据集 姓名,年龄,班级 ,成绩, 科目 student <- data.frame ( name = c("s1", "s2&q ...
- 关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
1.cocos2d-X中的坐标(0,0),就是运行框的左下角位置,所以运行框看起来就是一个第一象限. 2.节点的锚点就是我们setPosition所设定的位置,默认锚点是在节点的中心,也就是setPo ...