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