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


     }

 }

  

原文地址:https://www.cnblogs.com/acSzz/p/2414040.html