题目意思:有一个天枰,有C个挂钩和G个钩码,把所有的钩码挂在天枰的钩子上使天枰平衡的方案数。
输入:
2 4 //输入C,G
-2 3 //挂钩的位置,一以0为对称点
3 4 5 8 //钩码的重量
输出:使天枰平衡的方案数。
解析:
a[i][j]表示为挂上第i个钩码的平衡度为j,j=7500时表示平衡。
假设 dp[i-1][j] 的值已知,设dp[i-1][j]=num(即已知把前i-1个钩码全部挂上天枰后得到状态j的方法有num次)
那么dp[i][ j+ w[i]*c[k] ] = dp[i-1][j] = num
(即以此为前提,在第k个钩子挂上第i个钩码后,得到状态j+ w[i]*c[k]的方法也为num次)
想到这里,利用递归思想,不难得出 状态方程dp[i][ j+ w[i]*c[k] ]= ∑(dp[i-1][j])
接下来编码就是很简单的事情啦!
代码:
#include<iostream> using namespace std; int a[20][15000],c[21],w[21]; int main() { int n,g,i,j,k; cin>>n>>g; for(i=1;i<=n;i++) cin>>c[i]; for(i=1;i<=g;i++) cin>>w[i]; memset(a,0,sizeof(a)); a[0][7500]=1; for(i=1;i<=g;i++) { for(j=0;j<=15000;j++) if(a[i-1][j]) { for(k=1;k<=n;k++) a[i][j+w[i]*c[k]]+=a[i-1][j]; } } cout<<a[g][7500]<<endl; //system("pause"); return 0; }