题意:有一个天平,左臂右臂各长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;
}