POJ 1837

背包问题,可以很明显的判断为背包问题,因为他要求所有的 砝码都必须放上去,于是乎就变成了 01背包了 ,每种状态的取决于前一个状态,然后分析一下,因为他有-15 由于杠杆原理可以很清楚的知道最小的 为 20*15*25 于是就将状态平衡的位置进行相应的 移到了 dp【7500】;好了现在问题都解决了 接下来进行dp就可以了 

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int dp1[15000],dp2[15000];
int d[22],w[22];
int main()
{
     int C,G;
     while(scanf("%d%d",&C,&G)==2)
        {
            memset(dp2,0,sizeof(dp2));
            memset(dp1,0,sizeof(dp1));
            for(int i=0;i<C;i++)
            scanf("%d",&d[i]);
            for(int i=0;i<G;i++)
            scanf("%d",&w[i]);
            dp1[7500]=1;
            for(int i=0;i<G;i++)
            {
                for(int j=0;j<=15000;j++)
                if(dp1[j])
                 {
                    for(int k=0;k<C;k++)
                    dp2[j+w[i]*d[k]]+=dp1[j];
                 }
                memset(dp1,0,sizeof(dp1));
                for(int k=0;k<=15000;k++)
                    dp1[k]=dp2[k];
                memset(dp2,0,sizeof(dp2));

            }
            printf("%d\n",dp1[7500]);
        }

    return 0;
}


posted @ 2013-12-20 16:13  来自大山深处的菜鸟  阅读(133)  评论(0编辑  收藏  举报