POJ 1837 Balance (多重背包计数)

Balance

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 11706   Accepted: 7305

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

Romania OI 2002

题目链接:http://poj.org/problem?id=1837

题目大意:一个天平有C个位置有挂钩负号表示在中点的左边,有G个砝码,每个重gi,问让天平平衡的方案数

题目分析:根据杠杆定理可得到力臂*长度等于力矩,天平平衡即两边力矩相等,一边最大情况是15*20*25=7500,将其右移动,即0-15000,取dp[i][j]表示用了i个砝码使得平衡度为j的方案数,然后再用多重背包计个数,显然dp[G][7500]就是最后的答案

#include <cstdio>
#include <cstring>
int cc, gg;
int c[25], g[25];
int dp[25][15005];

int main()
{
    scanf("%d %d", &cc, &gg);
    for(int i = 1; i <= cc; i++)
        scanf("%d", &c[i]);
    for(int i = 1; i <= gg; i++)
        scanf("%d", &g[i]);
    dp[0][7500] = 1;
    for(int i = 1; i <= gg; i++)
        for(int j = 1; j <= 15000; j++)
            if(dp[i - 1][j])
                for(int k = 1; k <= cc; k++)
                    dp[i][j + g[i] * c[k]] += dp[i - 1][j];
    printf("%d\n", dp[gg][7500]);
}   

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 02:53:12

POJ 1837 Balance (多重背包计数)的相关文章

POJ 1837 Balance (01背包)

题意:有一个天平,左臂右臂各长15,然后给出n,m.n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂:m代表有m个砝码,要你求出使得这个天平保持平衡有几种方法,要求所有砝码全部使用完. 思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为放置的砝码数量,j为平衡状态,0为平衡,j<0左倾,j>0右倾,由于j作为下标不能是负数,所以我们要找一个新的平衡点,因为15*20*20 = 7500,所以平衡点设置为7500,然后我们可以得出动态方程 dp[i][j+w[i]*c[k

poj 1837 Balance (dp,01背包)

链接:poj 1837 题意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码, 求将钩码挂到钩子上使天平平衡的方法的总数.其中可以把天枰看做一个以x轴0点作为平衡点的横轴 分析:力臂=重量 *臂长 = g[i]*c[j] 当平衡度k=0时,说明天枰达到平衡,k>0,说明天枰倾向右边(x轴右半轴),k<0则左倾 因此可以定义一个 状态数组dp[i][k],意为在挂满前i个钩码时,平衡度为k的挂法的数量. 由于距离c[i]的范围是-15~15,钩码重量的范围是1~25,钩码数量

POJ 1837 Balance

题意:给你C个挂钩,W个钩码,要你能使一个天平平衡 数据解释: 2 4 -2 3 3 4 5 8 以原点为支点,那么-2代表支点左边2处有一个钩码,同理3代表右边的点 所以案例数据有一个成立的例子是(3+5)*3=(4+8)*2或是(3+4+5)*2=8*3(力臂平衡) 有2种情况所以输出2: 思路:这个如果不是按照题目的分类说是DP我还想不到这个思路,我感觉我进步挺大了,能独立推出转移方程了. 首先我们看这道题首先是要求力平衡,那么一个限制是重量.与力相关的有钩码与挂钩的位置.显然,钩码可以放

POJ 1742 Coins (多重背包)

Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 28448   Accepted: 9645 Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some

POJ 1742 Coins 多重背包单调队列优化

http://poj.org/problem?id=1742 题意: 很多硬币,有价值和数量,给出一个上限,问上限内有多少种钱数可以由这些硬币组成. 分析: 好像是楼教主男人八题之一.然后学多重背包单调队列优化时看了别人的程序..所以后来写了就1A了=.= 前一篇小小总结了一下多重背包单调队列优化(http://www.cnblogs.com/james47/p/3894772.html),这里就不写了. 1 #include<cstdio> 2 #include<cstring>

POJ 1014 Dividing (多重背包)

Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 58921   Accepted: 15200 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbl

poj 1837 Balance(背包)

题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10983   Accepted: 6824 Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different from any other

POJ - 1787 (多重背包还原路径|| 完全背包)

POJ  1787  Charlie's Change Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task

poj 1742 Coins 多重背包变形

传说中的男人八题,是男人就A这八题.有n种面额的硬币,面额个数分别为A_i.C_i,求最多能搭配出几种不超过m的金额? 这是一个多重部分和问题(多重背包问题),放在了<2.3 记录结果再利用的"动态规划" 优化递推关系式>.最基本的做法是: dp[i][j] := 用前i种硬币能否凑成j 递推关系式: dp[i][j] = (存在k使得dp[i - 1][j - k * A[i]]为真,0 <= k <= m 且下标合法) 然后三重循环ijk递推 1 2 3 4