POJ1837 Balance(dp)

题目链接

分析:

不得不说,这是一道好题。

dp[i][j],i代表前i个物品,j代表平衡度为j时的方法数。

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int dp[21][15002];

int main(){
    int n, g, i, j, k, t, c[21], w[21];
    scanf("%d %d", &n, &g);

    for(i=1; i<=n; i++) scanf("%d", &c[i]);
    for(i=1; i<=g; i++) scanf("%d", &w[i]);

    memset(dp, 0, sizeof(dp));

    dp[0][7500] = 1;

    for(i=1; i<=g; i++){
        for(j=0; j<=15000; j++){
            for(k=1; k<=n; k++){
                t = c[k]*w[i];
                if(j+t >= 0 && j+t <= 15000) dp[i][j+t] += dp[i-1][j];
            }
        }
    }

    printf("%d\n", dp[g][7500]);

    return 0;
}

 

posted on 2013-04-01 11:29  Still_Raining  阅读(151)  评论(0编辑  收藏  举报