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;
}

浙公网安备 33010602011771号