题目链接:poj19837
题目大意:有一个天平两臂各挂一些钩子, 每个钩子下面可以挂一些砝码, 问在使用所有的砝码的情况下有多少种方法可以使天平平衡
思路:该问题可以转化成分组背包的问题,大体如下对于每一种砝码来说我们可以关在任意一个钩子下面,这些事件是互斥的,一个砝码一个组进行分组背包即可,注意的是有负的力矩的存在, 因此我们将坐标轴移动到10000即可,代码如下。
注意的就是:这里平衡即两边的力矩相同 即每个砝码的力矩=距离*重量
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int dp[25][20000];//前者是个数 后者能到达的力矩 10000为平衡位置 这个数组记录是方法数
int pos[25],w[25];
int main()
{
int c,g;
while(~scanf("%d%d",&c,&g))
{
for(int i=1;i<=c;i++)scanf("%d",&pos[i]);
for(int i=1;i<=g;i++)scanf("%d",&w[i]);
memset(dp,0,sizeof dp);
dp[0][10000]=1;
for(int i=1;i<=g;i++)
{
for(int j=0;j<20000;j++)
{
for(int k=1;k<=c;k++)
{
int tp = w[i]*pos[k];//力矩
if(j-tp>=0&& dp[i-1][j-tp])
dp[i][j] += dp[i-1][j-tp];
}
}
}
printf("%d\n", dp[g][10000]);
}
return 0;
}