Balance
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 12995   Accepted: 8142

Description

Gigel has a strange "balance" and he wants to poise it. Actually, the device is different from any other ordinary balance.
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 input has the following structure:
• 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

The output contains the number M representing the
number of possibilities to poise the balance.

Sample Input

2 4
-2 3
3 4 5 8

Sample Output

2

Source

 

转载请注明出处: http://user.qzone.qq.com/289065406/blog/1299341345

提示:动态规划,01背包

初看此题第一个冲动就是穷举。。。。不过再细想肯定行不通= =O(20^20)等着超时吧。。。

我也是看了前辈的意见才联想到01背包,用动态规划来解

 

题目大意:

有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。

其中可以把天枰看做一个以x轴0点作为平衡点的横轴

输入:

2 4 //C 钩子数 与 G钩码数

-2 3 //负数:左边的钩子距离天平中央的距离;正数:右边的钩子距离天平中央的距离c[k]

3 4 5 8 //G个重物的质量w[i]

dp思路:

每向天平中方一个重物,天平的状态就会改变,而这个状态可以由若干前一状态获得。

首先定义一个平衡度j的概念

当平衡度j=0时,说明天枰达到平衡,j>0,说明天枰倾向右边(x轴右半轴),j<0则相反

那么此时可以把平衡度j看做为衡量当前天枰状态的一个值

因此可以定义一个 状态数组dp[i][j],意为在挂满前i个钩码时,平衡度为j的挂法的数量。

由于距离c[i]的范围是-15~15,钩码重量的范围是1~25,钩码数量最大是20

因此最极端的平衡度是所有物体都挂在最远端,因此平衡度最大值为j=15*20*25=7500。原则上就应该有dp[ 1~20 ][-7500 ~ 7500 ]。

因此为了不让下标出现负数,做一个处理,使使得数组开为 dp[1~20][0~15000],则当j=7500时天枰为平衡状态

那么每次挂上一个钩码后,对平衡状态的影响因素就是每个钩码的 力臂

力臂=重量 *臂长 = w[i]*c[k]

那么若在挂上第i个砝码之前,天枰的平衡度为j

(换言之把前i-1个钩码全部挂上天枰后,天枰的平衡度为j)

则挂上第i个钩码后,即把前i个钩码全部挂上天枰后,天枰的平衡度 j=j+ w[i]*c[k]

其中c[k]为天枰上钩子的位置,代表第i个钩码挂在不同位置会产生不同的平衡度

不难想到,假设 dp[i-1][j] 的值已知,设dp[i-1][j]=num

(即已知把前i-1个钩码全部挂上天枰后得到状态j的方法有num次)

那么dp[i][ j+ w[i]*c[k] ] = dp[i-1][j] = num

(即以此为前提,在第k个钩子挂上第i个钩码后,得到状态j+ w[i]*c[k]的方法也为num次)

想到这里,利用递归思想,不难得出 状态方程dp[i][ j+ w[i]*c[k] ]= ∑(dp[i-1][j])

有些前辈推导方式稍微有点不同,得到的 状态方程为dp[i][j] =∑(dp[i - 1][j - c[i] * w[i]])

其实两条方程是等价的,这个可以简单验证出来,而且若首先推导到第二条方程,也必须转化为第一条方程,这是为了避免下标出现负数

 

结论:

最终转化为01背包问题

状态方程dp[i][ j+ w[i]*c[k] ]= ∑(dp[i-1][j])

初始化:dp[0][7500] = 1;   //不挂任何重物时天枰平衡,此为一个方法

 

复杂度O(C*G*15000)  完全可以接受

自己的AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 21
int f[N][];
int weight[N],position[N],n,g;
int main(){
scanf("%d%d",&n,&g);
for(int i=;i<=n;i++) scanf("%d",position+i);
for(int i=;i<=g;i++) scanf("%d",weight+i);
f[][]=;//first
for(int i=;i<=g;i++){
for(int j=;j<=;j++){
if(f[i-][j]){
for(int k=;k<=n;k++){
f[i][j+weight[i]*position[k]]+=f[i-][j];
}
}
}
}
printf("%d\n",f[g][]);
return ;
}

poj1837的更多相关文章

  1. POJ1837 Balance[分组背包]

    Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13717   Accepted: 8616 Descript ...

  2. poj1837 dp

    //Accepted 2176 KB 47 ms //杠杆平横的条件:sum(c[i]*sum(g[j]))=0 // 所有的hook到原点的距离乘它上面挂着的物体的重量和的和为0 //对于一个hoo ...

  3. POJ1837 Balance(DP)

    POJ1837http://poj.org/problem?id=1837 题目大意就是说有一个称上有C个挂钩,告诉你每个挂钩的位置,现在有G个重物,求是之平衡的方法数. 转化一下:DP[i][j]表 ...

  4. poj1837挂砝码

    解法(背包DP问题) (下为转) 其实感觉 像此题这种类型的并不属于dp范畴 虽然程序看起来使用的是递推这一过程,但总不能说开个二重循环就是dp吧 如果只从求解上来讲(不考虑数据值的范围), 只有枚举 ...

  5. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...

  6. 【个人训练】(POJ1837)Balance

    这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索.dp.图论.这几天的题目应该就是这些范围. 题意 原题的意思大概是这样的, ...

  7. poj1837 Balance

    Balance  POJ - 1837 题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数. 其中可以把天枰看做一个以x轴0点 ...

  8. poj1837【背包】

    题意: 有一根杆子,给出一些杆子上的位置,位置上能放重物,再给出一些重物的重量. 重物都需要被使用,但是位置不一定都要用到. 问你能有多少种方法让这个杆子平衡. 思路: 在位置上是0/1背包思想,取或 ...

  9. POJ1837 Balance 背包

    题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子(每个钩子有相对于中心的距离,左负右正),有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数. 将每个砝码看作一组,组内各个物品 ...

随机推荐

  1. Java8 对多个异步任务进行流水线操作(笔记)

    现在我们要对商店商品进行折扣服务.每个折扣代码对应不同的折扣率,使用一个枚举变量Discount.Code来实现这一想法,具体代码如下所示. 以枚举类型定义的折扣代码 /** * 折扣服务api * ...

  2. lodash random

    _.random([min=0], [max=1], [floating]) 产生一个包括 min 与 max 之间的数. 如果只提供一个参数返回一个0到提供数之间的数. 如果 floating 设为 ...

  3. VLOOKUP多条件查找不使用辅助列

    问题描述: 可能很多人在使用VLOOKUP的时候,对于多条件时,则会使用辅助列进行查找,那么不使用辅助列是否也可以呢? 答案是:必须可以. 问题处理: 1.使用辅助列 2.不使用辅助列的操作如下: 公 ...

  4. Visual studio C++ MFC之树形控件Tree Control

    背景 本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题. 正文 树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一 ...

  5. Android实现蓝牙耳机连接

    代码地址如下:http://www.demodashi.com/demo/13259.html 前言 讲讲android对于蓝牙耳机连接技术的实现 今天涉及的内容有: 流程讲解 新建广播Bluetoo ...

  6. curl 重定向问题

    今天在curl一个网站的时候遇到一个奇怪的问题,下面是输出: lxg@lxg-X240:~$ curl -L http://www.yngs.gov.cn/ -v * Hostname was NOT ...

  7. chrome mp4格式支持问题

    经过一些搜索得知,其实根本的问题是虽然大家都是.mp4后缀的文件,但是编码方式不同,而video标签的标准是用H.264方式编码视频的MP4文件(当然video标签还可以播放WebM和OGG格式的文件 ...

  8. JS防后退跳转

    location.replace("http://www.baidu.com");

  9. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\

    解决方法: 1:设置 C:\windows\temp 文件夹安全权限  添加用户 NETWORK SERVICE  写入和读取权限 2:设置 C:\windows\temp 文件夹安全权限  添加用户 ...

  10. mysql group by 与order by的实例分析(mysql分组统计后最大值)

    CREATE TABLE `test` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) CHARACTER SET latin1 DEFAULT NULL, `c ...