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

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

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(可以达到的情况)

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int a[10];
 7 int dp[60000+10];
 8 
 9 int main()
10 {
11     int kase=0;
12     while (scanf("%d",&a[1]))
13     {
14         kase++;
15         int sum=a[1];
16         for (int i=2;i<=6;i++)
17         {
18             scanf("%d",&a[i]);
19             sum+=a[i]*i;
20         }
21         if (sum==0) break;
22         
23         
24         bool f=false;
25         if (sum%2==0)
26         {
27             sum=sum/2;
28             for (int i=1;i<=sum;i++) dp[i]=-1;
29             dp[0]=0;
30             for (int i=1;i<=6;i++)
31                 for (int j=0;j<=sum;j++)
32                 {
33                     if (dp[j]>=0) dp[j]=a[i];
34                     else
35                     {
36                         if (j<i || dp[j-i]<=0) dp[j]=-1;
37                             else dp[j]=dp[j-i]-1;
38                     }
39                 }
40             if (dp[sum]>=0) f=true;
41         }     
42         cout<<"Collection #"<<kase<<':'<<endl;
43         if (f) cout<<"Can be divided."<<endl;
44         else cout<<"Can't be divided."<<endl;
45         cout<<endl;
46     }
47 }
复制代码
posted @   iiyiyi  阅读(1699)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
阅读排行:
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程
点击右上角即可分享
微信分享提示