POJ 1837 Balance DP
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; }
新 blog : www.hrwhisper.me