POJ 1837 Balance DP

POJ:http://poj.org/problem?id=1837

下午看完某萌妹子的比赛后回来继续刷题,太困了想不出来T T,小睡一觉还是想不出来QAQ,搜了题解做出来了,Orz大牛。

大意:

给出天平的钩码和挂钩位置,你需要的是计算出使天平达到平衡总的方法数。


补充知识:天平的话距离平衡点的长度*钩码的重量(表达不好大概就是这样)

然后设dp(i,j)为达到状态j的方法数,那么一开始不挂钩码就可以平衡,初始状态为1.

可以得到状态转移方程:dp[i][j+c[k]*g[i]+7500] += dp[i-1][j+7500];

代码上有详细注释,吃饭去~

#include<cstdio>
#include<cstring>
const int MAXN=150000+1;
int dp[21][MAXN];     //设dp(i,j)为达到状态j的方法数
int c[21],g[21];
int main()
{
	int C,G;
	scanf("%d%d",&C,&G);

	for(int i=1;i<=C;i++)
		scanf("%d",&c[i]);
	for(int i=1;i<=G;i++)
		scanf("%d",&g[i]);

	dp[0][7500]=1;     //设7500为天枰达到平衡状态时的平衡度  
					   //一开始不放钩码就可以达到平衡,所以为1
	for(int i=1;i<=G;i++)
	{
		for(int j=-7500; j<=7500;j++)
		{		
			if(dp[i-1][j+7500])     //优化,前面没出现过,那么跳过
				for(int k=1;k <= C; k++)
				{
					dp[i][j+c[k]*g[i]+7500] += dp[i-1][j+7500];
				}	
		}
	}
	printf("%d\n",dp[G][7500]);    //根据上面的步奏,全部取完钩码后达到平衡点即为答案
	return 0;
}


你可能感兴趣的:(POJ 1837 Balance DP)