poj 1837 Balance (暴力dp)

这题不难,挺不错的一题,可以算是暴力dp了,所有情况都遍历一边,状态迭代下去。

状态方程:

dp[i][j + G[i] * C[k]] += dp[i - 1][j];//G是重量,C是距离平衡点的距离

枚举重量,然后枚举所放的位置,所有状态都搜索到。

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
typedef __int64 lld;
#define oo 0x3f3f3f3f
#define Mod 10007
#define oo 0x3f3f3f3f
#define maxn 15005
int dp[22][maxn];
int C[22],G[22];

int main()
{
    int c,g;
    while(scanf("%d %d",&c,&g)!=EOF)
    {
        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=0;i<=g;i++)
        {
            for(int j=0;j<=15000;j++)
            {
                if(dp[i][j]==0)continue;
                for(int k=1;k<=c;k++)
                    dp[i+1][j+G[i+1]*C[k]]+=dp[i][j];
            }
        }
        printf("%d\n",dp[g][7500]);
    }
    return 0;
}



你可能感兴趣的:(dp,poj)