POJ 1837:Balance 天平DP。。。

Balance

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 11878   Accepted: 7417

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

题意是给了一个秤,然后给你几个点的位置用来放秤砣,负号代表在秤的左边,正好代表在秤的右边。

然后又给了几个秤砣,给了秤砣的重量。题目求的是用这些秤砣有多少种平衡方案。

读完题根本没感觉这是一道DP题。。。后来看得多了才发现应该看到这么小的数值 就想到枚举状态,这样逐渐往下推的DP,好歹这样题也不少了,什么分1 2 3 4 5 6石头的,都是这种思想。

这题也是用DP[i][j]表示放置第i个秤砣 秤的状态是j时的方案。

秤的状态通过计算15*25*20,即最远能到达7500。左右都是,即应该-7500到7500。但因为数组下标一定是大于等于零的,所以就用0~15000表示。

DP[0][7500]=1表示一个秤砣都没放时,状态在平衡状态,且只有一种平衡方案。

然后就是。。。(我其实更愿意把它说成是枚举。。。)往下推。

核心代码:

	for(i=1;i<=G;i++)
	{
		for(j=0;j<=15000;j++)
		{
			for(k=1;k<=C;k++)
			{
				dp[i][j] += dp[i-1][j-weight[i]*weizhi[k]];
			}
		}
	}

即对每一个给定的秤砣不断枚举其原来的状态,不断枚举其所在位置,导致这次能达到的状态。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std;
//最大的状态也就是所有的砝码都放在了最端点的位置
//即20*25*15=7500 即-7500~7500

int dp[21][15001];
int weizhi[21];
int weight[21];

int main()
{

	memset(dp,0,sizeof(dp));
	dp[0][7500]=1;
	int C,G,i,j,k;
	cin>>C>>G;

	for(i=1;i<=C;i++)
		cin>>weizhi[i];
	for(i=1;i<=G;i++)
		cin>>weight[i];

	for(i=1;i<=G;i++)
	{
		for(j=0;j<=15000;j++)
		{
			for(k=1;k<=C;k++)
			{
				dp[i][j] += dp[i-1][j-weight[i]*weizhi[k]];
			}
		}
	}

	cout<<dp[G][7500]<<endl;
	return 0;
}

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

时间: 2024-11-29 02:28:30

POJ 1837:Balance 天平DP。。。的相关文章

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 背包dp

点击打开链接 Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11067   Accepted: 6865 Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different from any other ordinary balance. It orders t

POJ 1837 Balance 【DP】

题意:给出一个天平,给出c个钩子,及c个钩子的位置pos[i],给出g个砝码,g个砝码的质量w[i],问当挂上所有的砝码的时候,使得天平平衡的方案数, 用dp[i][j]表示挂了前i个砝码时,平衡点为j时的总的方案数, 状态转移为第i个砝码是否挂上,如果要挂上第i个砝码的话,j>=pos[i]*w[i](力矩=力臂*力) 因为最大的力矩为 20*15*25=150000 1 #include<iostream> 2 #include<cstdio> 3 #include<

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 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 1837 Balance DP

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10299   Accepted: 6372 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

DP/POJ 1837 Balance

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int f[25][15010]; 5 int c[25],g[25]; 6 int C,G; 7 int main() 8 { 9 scanf("%d%d",&C,&G); 10 for (int i=1;i<=C;i++) scanf("%d",&c[i]); 11 for (int

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

poj 1837 Balance 动态规划

题目链接:http://poj.org/problem?id=1837 使用迭代器对STL容器进行遍历的方法: for(set<int>::iterator it = check.begin(); it != check.end(); it++) { //...*it }   本题 a[]存挂钩位置 b[]存物品质量 把挂在天平左边的物品的质量视为负数 反之为正数 总质量的极限为20件重25的物品都挂在15的天平挂钩处 即7500 dp[i][j]表示前i件物品总质量为(j-10000)时的挂