hdu1059(多重背包优化)
使用一种二进制的优化, 可以完美的解决这题,《背包九讲》中说的非常好
但是还有一种线性复杂的算法。 应该算是该题很巧妙的解法
for(i=1;i<=;i++)
{
for(l=total;l>=;l--)
{
if(dp[l]==) continue;
for(k=;k<=num[i]&&k*i+l<=total;k++)
{
if(dp[k*i+l]) break; // 这个剪枝瞬间将复杂度从N^2变成了N。
dp[k*i+l]=;
}
}
}
代码中total是我们要装满的容量, 循环的次序很重要。 当关键还是那一步剪枝
在附上一份用二进制优化多重背包的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <sstream>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
struct node
{
int w,c;
}g[]; //将log2压缩后的元素存在这里! int k[];
int dp[]; int mpow(int x)
{
int sum=;
for(int i=;i<x;i++)
sum=sum*;
return sum;
} int main()
{
//freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
//freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
int tt=;
while()
{
int tmp=,sum=;
for(int i=;i<=;i++)
{
scanf("%d",&k[i]);
tmp+=k[i];
sum+=k[i]*i;
}
if(tmp==) break;
printf("Collection #%d:\n",tt++);
if(sum%!=)
{
printf("Can't be divided.\n");
printf("\n");
continue;
}
int cnt=;
for(int i=;i<=;i++)
{
if(k[i]==) continue;
tmp=;
int tk=;
while(*tk- < k[i])
{
g[cnt].w=;
g[cnt].c=i*tk;
cnt++;
tmp+=tk;
tk*=;
}
g[cnt].w=;
g[cnt].c=i*(k[i]-tmp);
cnt++;
}
for(int i=;i<=sum/;i++)
{
dp[i]=-INF;
}
dp[]=;
for(int i=;i<cnt;i++)
{
for(int j=sum/;j>=g[i].c;j--)
{
dp[j]=max(dp[j],dp[j-g[i].c]+g[i].w);
}
}
if(dp[sum/]>=)
printf("Can be divided.\n");
else printf("Can't be divided.\n");
printf("\n");
}
return ;
}
hdu1059(多重背包优化)的更多相关文章
- hdu1059 多重背包(转换为01背包二进制优化)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1059 之前写过一个多重背包二进制优化的博客,不懂请参考:http://www.cnblog ...
- hdu1059(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意 : 按顺序读入一些列数,所对应的序列代表价值,数值代表个数(如a[5]=6 ,代表价值为五 ...
- [DP之多重背包优化方法]
首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...
- hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 3732 Ahui Writes Word 多重背包优化01背包
题目大意:有n个单词,m的耐心,每个单词有一定的价值,以及学习这个单词所消耗的耐心,耐心消耗完则,无法学习.问能学到的单词的最大价值为多少. 题目思路:很明显的01背包,但如果按常规的方法解决时间复杂 ...
- Educational Codeforces Round 61 (Rated for Div. 2) E 多重背包优化
https://codeforces.com/contest/1132/problem/E 题意 有8种物品,重量是1~8,每种数量是\(cnt[i]\)(1e16),问容量为W(1e18)的背包最多 ...
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)
4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Disc ...
- Codeforces 755 F. PolandBall and Gifts 多重背包+贪心
F. PolandBall and Gifts It's Christmas time! PolandBall and his friends will be giving themselves ...
- hdu1059 dp(多重背包二进制优化)
hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...
随机推荐
- 【 Linux 】单台服务器上并发TCP连接数(转)
单台服务器上并发TCP连接数 问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制: 对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...
- xaf 修改主页logo
https://documentation.devexpress.com/#Xaf/CustomDocument3156
- 5V系统和3.3V系统电平转换
在设计一个带MCU或者ARM系统电路时候,经常遇见MCU的VCC是3.3V,但是外围电路需要5V.有时候是反过来.虽然现在MCU的IO都声称支持TTL电平,但是我们谁也不想将MCU的IO口直接接上5V ...
- path方法总结
$.mobile.path.get(url);//获取URL地址的目录部分,就是除了a.html之外的那部分 jQuery.mobile.path.getDocumentBase(bool) //获取 ...
- 53. Reverse Words in a String【easy】
Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...
- jQuery 效果 - slideToggle() 方法
实例 通过使用滑动效果,在显示和隐藏状态之间切换 <p> 元素: $(".btn1").click(function(){ $("p").slide ...
- 等边三角形---dfs
蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到. 例如,蒜头君手上有长度为 11,22,33,33 的4根木棍,他可以让长度为11,22 的木棍组成一 ...
- Delphi之Raise抛出异常
相关资料: http://blog.csdn.net/a20071426/article/details/10160171 实例代码: unit Unit1; interface uses Windo ...
- [转]PHP 5.3.0以上推荐使用mysqlnd驱动
我们一般的使用场景,比较少关注PHP版本的问题,而且市面上提供的PHP运行环境都还是5.2系列的. 原文:http://zhangxugg-163-com.iteye.com/blog/1894990 ...
- 007杰信-factory的启用+停用
业务需求:当有一些factory与我们不在合作时,我们不能直接删除这个公司的数据,我们采用的办法是在factory_c表增加一个字段STATE(CHAR(1)),1表示是启用,0是表示停用. 准备工作 ...