POJ 1837(01背包)

题目链接:http://poj.org/problem?id=1837

这道题目思考了很久都没写出状态转移方程,各种BUG,最后还是去往上搜了一下题解。

#include<iostream>
#include<cstdio>
using namespace std;

const int maxn=15050;
int C,G;
int c[35],g[35];
int dp[35][maxn];
//dp[i][j]表示挂满前i个钩码的平衡度为j
//状态转移方程dp[i][j+g[i]*c[k]]+=dp[i][j],这样写是为了避免负数的情况

int main(){
#ifndef ONLINE_JUDGE
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
#endif
    while(~scanf("%d%d",&C,&G)){
    	for(int i=1;i<=C;i++)
    		scanf("%d",&c[i]);
    	for(int i=1;i<=G;i++)
    	    scanf("%d",&g[i]);
    	memset(dp,0,sizeof(dp));
		dp[0][7500]=1;//一个钩码都不挂,天平平衡
    	for(int i=1;i<=G;i++){
    		for(int j=0;j<=15000;j++){
    			if(dp[i-1][j]){
					for(int k=1;k<=C;k++){
						dp[i][j+g[i]*c[k]]+=dp[i-1][j];
					}
    			}
    		}
    	}
    	printf("%d\n",dp[G][7500]);
    }
	return 0;
}


你可能感兴趣的:(POJ 1837(01背包))