POJ-1837-Balance-0 1背包

来源:互联网 发布:周杰伦的影响力知乎 编辑:程序博客网 时间:2024/05/29 19:18

背包问题,先找状态方程。

输入c,g。c代表挂钩的数量。g代表砝码的数量。

然后输入c个数代表挂钩的位置。

g个数代表砝码的质量。

判断当g个砝码都放上去的时候,平衡状态一共有几种。

对于可能的状态为-7500~7500(7500=15*20*25)即为0~15000;

设立状态数组dp[21][15000];21代表着放上去的砝码的个数,共有20种可能,因为最多只有20个砝码。

15000代表着此时的状态,7500时为平衡状态。

显然可以得到状态方程:

if(dp[i-1][j]){    for(i=1;i<=c;i++)    {        dp[i][j+a[k]*b[i]]+=dp[i-1][j];    }}
则dp[g][7500]的数值即为当所有的砝码都放上去的时候,平衡状态的种类了;

程序:


#include<iostream>#include<cstdlib>#include<cstring>using namespace std;int main(){    int c,g,i,k,j;    int a[50],b[50];    int dp[21][15001];    cin>>c>>g;    for(i=0;i<c;i++)//挂钩        cin>>a[i];    for(i=0;i<g;i++)//砝码        cin>>b[i];    memset(dp,0,sizeof(dp));    dp[0][7500]=1;    for(i=1;i<=g;i++)    {        for(j=0;j<=15000;j++)        {            if(dp[i-1][j])            {                for(k=0;k<c;k++)//挂钩                {                    dp[i][j+a[k]*b[i-1]]+=dp[i-1][j];                }            }        }    }    cout<<dp[g][7500]<<endl;    return 0;}


原创粉丝点击