POJ1873 - Balance(01背包)

题目大意

现有一个天平,它有C个挂钩和G个砝码,问有多少种方法可以使得天平平衡(砝码必须用完)

题解

其实就是让背包容量为0的方法有多少种方法,但是这样的话背包容量会出现负数,所以可以平移一下,背包容量最大值为20*25*15=7500,即平移量为7500,最后答案就是dp[G][7500]

代码:

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

#define MAXN 7500

int dp[25][MAXN*2+5];

int a[25],w[25];

int main()

{

    int n,m;

    while(cin>>n>>m)

    {

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

        for(int i=1; i<=n; i++)

            cin>>a[i];

        for(int i=1; i<=m; i++)

            cin>>w[i];

        dp[0][MAXN]=1;

        for(int i=1; i<=m; i++)

            for(int j=1; j<=n; j++)

            {

                int value=w[i]*a[j];

                for(int k=0; k<=MAXN*2; k++)

                    if(dp[i-1][k])

                        dp[i][k+value]+=dp[i-1][k];

            }

        cout<<dp[m][MAXN]<<endl;

    }

    return 0;

}

你可能感兴趣的:(poj)