poj 1837 Balance (背包的应用)

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]);





     }



 }

  

你可能感兴趣的:(poj)