吉格尔有一种奇怪的”天平”,他想要平衡它。实际上,这个装置和普通的天平不同。
它由两个重量可以忽略的臂构成,每个臂的长度都是15。这些臂上装有一些挂钩,吉格尔想要用他收藏的G个重量(1 <= G <= 20)来挂在这些挂钩上,已知这些重量的取值范围是1到25,并且它们是不同的。吉格尔可以在任何挂钩上挂任意重量,但他必须使用所有的重量。
最后,吉格尔利用他在全国信息学奥林匹克竞赛中积累的经验成功平衡了装置。现在他想知道有多少种方法可以平衡这个装置。
已知挂钩的布局和重量集合,请编写一个程序来计算平衡装置的可能性数量。
保证每个测试案例至少存在一种解决方案。
输入的结构如下:
第一行包含数字C(2 <= C <= 20)和数字G(2 <= G <= 20);
下一行包含C个整数(这些整数也是不同的,并按升序排序),范围为-15到15,表示挂钩的分布;每个数字表示相对于平衡中心在X轴上的位置(当没有挂上重量时,设备是平衡的,与X轴对齐;距离的绝对值表示挂钩与平衡中心之间的距离,数字的符号确定挂钩所连接的臂:’-‘表示左臂,’+’表示右臂);
接下来一行包含G个自然数,不同且按升序排序,范围为1到25,表示重量的值。
# include<iostream>
using namespace std;
const int N = 50, M = 20000;
int f[N][M];
int c[N], w[N];
int n_c, n_g;
//7500是中点
//f[i][j]表示选前i个, balance = j 的方案数
//f[i][j] = f[i-1][j-c[k]*w[i]]
int main()
{
cin>>n_c>>n_g;
for(int i = 1; i<=n_c; i++)
cin>>c[i];
for(int i = 1; i<=n_g; i++)
cin>>w[i];
//初值设置
f[0][7500] = 1;
for(int i = 1; i<=n_g; i++)
for(int j = 0; j<=15000; j++)
for(int k = 1; k<=n_c; k++)
if(j >= c[k]*w[i]) f[i][j] += f[i-1][j-c[k]*w[i]];
cout<<f[n_g][7500];
}