poj 1837 01背包
有个小技巧,因为力矩可能为负数,就把所有的力矩都加上一个值(加上后保证为正数就好),最后输出组成这个数的方案数
#include<stdio.h> #include<string.h> int pos[30],w[30]; int dp[21][4000]; int main() { int C,G; int i,j,k; scanf("%d%d",&C,&G); for(i=1;i<=C;i++) scanf("%d",&pos[i]); for(i=1;i<=G;i++) scanf("%d",&w[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=C;i++) dp[1][1000+w[1]*pos[i]]++; for(i=2;i<=G;i++) { for(j=1;j<=C;j++) { for(k=1;k<=2000;k++) { if(dp[i-1][k]) dp[i][k+w[i]*pos[j]]+=dp[i-1][k]; } } } printf("%d\n",dp[G][1000]); return 0; }