POJ-1837 dp(01背包)

题意:有一个天平,左臂右臂各长15,然后给出n,m,n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂

m代表有m个砝码,要你求出使得这个天平保持平衡有几种方法,要求所有砝码全部使用完

题解:首先我们明确dp[i][j]中i与,j分别代表什么:i 代表砝码数量 j 代表现在的平衡状态,dp[i][j]是挂了前 i 个挂钩后的平衡状态 为j的情况数量。我们还要为 j 设一个平衡点,因为数组下标不能为负数。因为15*20*20=7000,7000为0为平衡点时的极限,所以我用了7500为平衡点。

然后列方程:

dp[i][j+w[i]*c[k])+=dp[i-1][j];

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
	int n, m;
	int d[25];
	int dp[25][15005];
	int w[25];
	memset(dp, 0, sizeof(dp));
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &d[i]);
	}
	for (int i = 0; i < m; i++)
	{
		scanf("%d", &w[i]);
	}
	dp[0][7500] = 1;
	for (int i = 1; i <= m; i++)
	{
		for (int j = 0; j <= 15000; j++)
		{
			if (dp[i - 1][j])
			{
				for (int k = 0; k < n; k++)
				{
					dp[i][j + w[i-1] * d[k]] += dp[i - 1][j];
				}
			}
		}
	}
	cout << dp[m][7500] << endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/usernamezzz/article/details/80367485