1 题解
设m表秤刻度的个数,n表示秤砣的数目。 数组p存储挂钩的位置,数组w存储秤砣的质量。 d[i][j]存储前i个秤砣平衡度为j的最大组合数(平衡度j>0表示左边重,j<0右边重,j=0平衡)。 利用动态规划状态方程思想:
-
d[i][j] += d[i-1][j-p[k]*w[i]]
前i个平衡度为j的数目 = 所有前i-1个,平衡度为 j-p[k]*w[i] 的数目(k取1~m)。 这样才能取到最大。 因为考虑到左右正负数的问题,所以所有j都加7500(20×25×15),此时平衡时j=7500。 最后d[n][7500]即为所求。
2 源代码
#include <iostream> using namespace std; int d[21][15002]; int p[21]; //position int w[21]; //weight int main() { int i, j, k, m, n; while(cin>>m>>n){ for(i=1; i<=m; i++) cin>>p[i]; for(i=1; i<=n; i++) cin>>w[i]; d[0][7500] = 1; for(i=1; i<=n; i++) for(j=-7500; j<=7500; j++) for(k=1; k<=m; k++) if(j+7500>=p[k]*w[i]) d[i][j+7500] += d[i-1][j+7500-p[k]*w[i]]; cout<<d[n][7500]<<endl; } }
-
两维数组
Date: 2011-08-22 23:20:13
HTML generated by org-mode 6.33x in emacs 23