http://poj.org/problem?id=1837
/*题意:有一个device(直杆),以中点为支点,左右长度都为15, 上面在不同位置分布着一些挂钩。现在给出c个挂钩, 和它们在杆上的位置(以中点的原点的x轴表示),以及Gigel有G个砝码,和它们各自的重量。求如果把这些钩码全部挂在任意钩上(一钩个挂任意多个), 最终device能达到平衡的情况数。 解题思路:01背包。首先这里有负数,所以用到了偏移变量temp(以他为平衡点),dp[i][j]表示 i件东西,放上去达到j重量所需的方法数。 因为最终要的是平衡状态 所以答案为:dp[g][temp]; 状态方程 :dp[i][k+val]+=dp[i-1][k]; */ #include<stdio.h> #include<string.h> const int Nmax=15000; const int temp=7500; int dp[30][Nmax],h[30],w[30]; int main() { int i,j,k,c,g,val; while(scanf("%d%d",&c,&g)!=EOF) { for(i=1;i<=c;i++)scanf("%d",&h[i]); for(i=1;i<=g;i++)scanf("%d",&w[i]); memset(dp,0,sizeof(dp)); dp[0][temp]=1; for(i=1;i<=g;i++) { for(j=1;j<=c;j++) { val=h[j]*w[i]; for(k=0;k<=Nmax;k++) if(dp[i-1][k]) dp[i][k+val]+=dp[i-1][k]; } } printf("%d\n",dp[g][temp]); } }