首页 > 其他 > 详细

【动态规划/多重背包问题】POJ1014-Dividing

时间:2015-06-28 18:45:36      阅读:240      评论:0      收藏:0      [点我收藏+]

多重背包问题的优化版来做,详见之前的动态规划读书笔记。

dp[i][j]表示前i中数加得到j时第i种数最多剩余几个(不能加和得到i的情况下为-1)递推式为:

dp[i][j]=mi(dp[i-1][j]≥0,即前i-1种数就能达到数字j)

   =-1(j<ai 或者 dp[i][j-ai]≤0,即再加上一个第i种数也无法达到j 或者 当前和小于当前数)

   =dp[i][j-ai]-1(可以达到的情况)

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

int a[10];
int dp[60000+10];

int main()
{
    int kase=0;
    while (scanf("%d",&a[1]))
    {
        kase++;
        int sum=a[1];
        for (int i=2;i<=6;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i]*i;
        }
        if (sum==0) break;
        
        
        bool f=false;
        if (sum%2==0)
        {
            sum=sum/2;
            for (int i=1;i<=sum;i++) dp[i]=-1;
            dp[0]=0;
            for (int i=1;i<=6;i++)
                for (int j=0;j<=sum;j++)
                {
                    if (dp[j]>=0) dp[j]=a[i];
                    else
                    {
                        if (j<i || dp[j-i]<=0) dp[j]=-1;
                            else dp[j]=dp[j-i]-1;
                    }
                }
            if (dp[sum]>=0) f=true;
        }     
        cout<<"Collection #"<<kase<<:<<endl;
        if (f) cout<<"Can be divided."<<endl;
        else cout<<"Can‘t be divided."<<endl;
        cout<<endl;
    }
}

【动态规划/多重背包问题】POJ1014-Dividing

原文:http://www.cnblogs.com/iiyiyi/p/4605831.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!