POJ 1837 Balance
题意: 有 一个天平, 已知 m 个位置,和 n 个砝码的质量问使得天平平衡共有多少种方法。
分析: 用 滚动数组 c1[8000],c2[8000],
c1[i] 表示 平衡度为 i 当 0<i<8000 时 表示重心在左侧, 当 8000<i<16000 时表示重心在右侧, 最后
c1[8000] 表示的即为平衡的情况数,
递推式 c1[j]+=c2[j+a[i]*p[k]];
#include<stdio.h> #include<string.h> int c1[16005],c2[16005]; int p[30],a[30]; int main() { int n,m,i,j,k; while(scanf("%d%d",&m,&n)!=EOF) { for(i=0;i<m;i++) scanf("%d",&p[i]); for(i=0;i<n;i++) scanf("%d",&a[i]); c2[8000]=1; for(i=0;i<n;i++) { for(j=0;j<=16000;j++) for(k=0;k<m;k++) c1[j]+=c2[j+a[i]*p[k]]; for(j=0;j<16000;j++) { c2[j]=c1[j]; c1[j]=0; } } printf("%d\n",c2[8000]); } return 0; }