POJ:http://poj.org/problem?id=1837
下午看完某萌妹子的比赛后回来继续刷题,太困了想不出来T T,小睡一觉还是想不出来QAQ,搜了题解做出来了,Orz大牛。
大意:
给出天平的钩码和挂钩位置,你需要的是计算出使天平达到平衡总的方法数。
补充知识:天平的话距离平衡点的长度*钩码的重量(表达不好大概就是这样)
然后设dp(i,j)为达到状态j的方法数,那么一开始不挂钩码就可以平衡,初始状态为1.
可以得到状态转移方程:dp[i][j+c[k]*g[i]+7500] += dp[i-1][j+7500];
代码上有详细注释,吃饭去~
#include<cstdio>
#include<cstring>
const int MAXN=150000+1;
int dp[21][MAXN]; //设dp(i,j)为达到状态j的方法数
int c[21],g[21];
int main()
{
int C,G;
scanf("%d%d",&C,&G);
for(int i=1;i<=C;i++)
scanf("%d",&c[i]);
for(int i=1;i<=G;i++)
scanf("%d",&g[i]);
dp[0][7500]=1; //设7500为天枰达到平衡状态时的平衡度
//一开始不放钩码就可以达到平衡,所以为1
for(int i=1;i<=G;i++)
{
for(int j=-7500; j<=7500;j++)
{
if(dp[i-1][j+7500]) //优化,前面没出现过,那么跳过
for(int k=1;k <= C; k++)
{
dp[i][j+c[k]*g[i]+7500] += dp[i-1][j+7500];
}
}
}
printf("%d\n",dp[G][7500]); //根据上面的步奏,全部取完钩码后达到平衡点即为答案
return 0;
}