题目链接:http://poj.org/problem?id=1837
解析详见代码注释:
#include<stdio.h>
#include<string.h>
int dp[21][150001];//数组开到足够大
int main()
{
int c,g;//挂钩数和砝码数
int cc[21],gg[21];
while(~scanf("%d%d",&c,&g))
{//模拟一架天平
for(int i=1;i<=c;i++)
scanf("%d",&cc[i]);//存储放砝码的位置
for(int i=1;i<=g;i++)
scanf("%d",&gg[i]);//存储砝码重量
memset(dp,0,sizeof(dp));
dp[0][7500]=1; //放置0个的时候是一种平衡情况,以7500为天平的中点
for(int i=1;i<=g;i++)
{
for(int j=0;j<=15000;j++)
{
if(dp[i-1][j])//优化,有前状态才计算
{
for(int k=1;k<=c;k++)
{
dp[i][j+gg[i]*cc[k]]+=dp[i-1][j];//状态方程
}
}
}
}
printf("%d\n",dp[g][7500]);//最后经过原点的个数就是所有平衡情况
}
return 0;
}