http://poj.org/problem?id=1837
/*题意:有一个device(直杆),以中点为支点,左右长度都为15,
上面在不同位置分布着一些挂钩。现在给出c个挂钩,
和它们在杆上的位置(以中点的原点的x轴表示),以及Gigel有G个砝码,和它们各自的重量。求如果把这些钩码全部挂在任意钩上(一钩个挂任意多个),
最终device能达到平衡的情况数。
解题思路:01背包。首先这里有负数,所以用到了偏移变量temp(以他为平衡点),dp[i][j]表示
i件东西,放上去达到j重量所需的方法数。
因为最终要的是平衡状态 所以答案为:dp[g][temp];
状态方程 :dp[i][k+val]+=dp[i-1][k];
*/
#include<stdio.h>
#include<string.h>
const int Nmax=15000;
const int temp=7500;
int dp[30][Nmax],h[30],w[30];
int main()
{
int i,j,k,c,g,val;
while(scanf("%d%d",&c,&g)!=EOF)
{
for(i=1;i<=c;i++)scanf("%d",&h[i]);
for(i=1;i<=g;i++)scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
dp[0][temp]=1;
for(i=1;i<=g;i++)
{
for(j=1;j<=c;j++)
{
val=h[j]*w[i];
for(k=0;k<=Nmax;k++)
if(dp[i-1][k])
dp[i][k+val]+=dp[i-1][k];
}
}
printf("%d\n",dp[g][temp]);
}
}