hdu1059 dp(多重背包二进制优化)
hdu1059
题意,现在有价值为1、2、3、4、5、6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等。
很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听过```不得不吐槽自己的知识面太窄```于是,我用了母函数写这题,母函数的做法并没有问题,但是由于这道题的数据很大,母函数轻轻松松就超时了,于是,我又很努力地在母函数循环的优化上面想出路,改改改,各种改之后依旧TLE,01背包的做法显然也是会超时的,DISCUSS里的母函数做法优化方式都是模上一个大质数,但很明显,只是因为数据较弱才会过的,因为没有人能保证被这个数模掉的那些部分是否可以平分,模掉之后剩下的数也很有可能就因此不能平分了所以这种优化肯定是不可取的。
问过学长粗看了题解之后才知道原来还有一种叫多重背包的东西,学长推荐我看背包九讲,我看了之后才会做这个题目```
多重背包其实本身也是01背包,但由于有多个价值相同的物品,所以有更加优化的解法就是用二进制优化,将相同价值的物品分为 20, 21 , 22 ,```个,最后再有一部分不能继续向二进制高阶划分的,将这些被划分的物品分别合成一个物品,那么就得到了价值为 1 倍的、2倍的、4倍的```物品,然后再按照01背包的做法,通过二进制数的加和可以实现物品的所有放入情况。
#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int Va[],We[],n[],dp[]; int main(){
int c=;
while(scanf("%d%d%d%d%d%d",&n[],&n[],&n[],&n[],&n[],&n[])!=EOF&&(n[]!=||n[]!=||n[]!=||n[]!=||n[]!=||n[]!=)){
// if(c)printf("\n");
printf("Collection #%d:\n",++c);
int i,j,sum=,mid;
for(i=;i<=;i++)sum+=i*n[i];
if(sum%){
printf("Can't be divided.\n\n");
continue;
}
else mid=sum/;
memset(dp,-,sizeof(dp));
int count=,temp;
for(i=;i<=;i++){
temp=;
while(n[i]>=temp){
Va[++count]=i*temp;
We[count]=temp;
n[i]-=temp;
temp*=;
}
if(n[i]>){
Va[++count]=i*n[i];
We[count]=n[i];
}
}
dp[]=;
for(i=;i<=count;i++){
for(j=mid;j>=Va[i];j--){
if(dp[j-Va[i]]>=){
dp[j]=max(dp[j],dp[j-Va[i]]+We[i]);
}
}
}
if(dp[mid]>)printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return ;
}
hdu1059 dp(多重背包二进制优化)的更多相关文章
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...
- HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...
- BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)
BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...
- hdu-1059(多重背包+二进制优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意:输入6个数,每个数ni代表价值为i的物品有ni个.求如果这些物品能均分给两个人,每个人获得 ...
- hdu 2191 (多重背包+二进制优化)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- Coins(多重背包+二进制优化)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- Cash Machine POJ - 1276 多重背包二进制优化
题意:多重背包模型 n种物品 每个m个 问背包容量下最多拿多少 这里要用二进制优化不然会超时 #include<iostream> #include<cstdio> #in ...
- HDU 5445 Food Problem(多重背包+二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...
随机推荐
- 关于C#中的日期的一个简单总结
首先,总结两个简单的方法,实现 秒 与 日期 的相互转换: public class MyTest { /// <summary> /// 将Unix时间戳转换为DateTime类型时间, ...
- rabbitmq 消息的状态转换
tutorial:http://www.rabbitmq.com/tutorials/tutorial-two-java.html 这里解释接收消息端关于 acknowledge和prefetch的设 ...
- ArcGIS API for Silverlight——小滑块
Widgets翻译过来是小玩具.如果使用过Dojo或者ExtJS等js框架肯定会了解到这个“小玩具”也有大用处,能够在很大程度上减少我们的工作量,快速完成功能需求.能减少多大工作量呢?让我们先来,点击 ...
- English trip -- VC(情景课) 7 B Clothing 服装
xu言: 不要使用中式的思维去思考西方的语义!!!切记切记 words a tie 领带 a blouse 女士衬衣 a sweater 毛衣 a skirt 短裙 a jacket 夹 ...
- English trip -- VC(情景课)3 D Reading
xu言: 感觉睡眠尽量还是要保证7+小时,才能让自己的脑袋更清醒一些... Read 阅读 My Family My name is Gloria. This is my family . This ...
- android------adb命令 pull或push手机和电脑文件交互
先说一下adb命令配置,如果遇到adb不是内部或外部命令,也不是可运行的程序或批量文件.配置下环境变量 1.adb不是内部或外部命令,也不是可运行的程序或批量文件. 解决办法:在我的电脑-属性-高级计 ...
- Android之设计模式
设计模式的概念 1.基本定义:设计模式(Design pattern)是一套被反复使用的代码设计经验的总结.使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.设计模式是是软件工程的基石脉络, ...
- hdu 2018多校8
A.Character Encoding 简单计数 m个非负数和等于k的方案数为$\binom{m+k-1}{k}$, 但题目还要求每个数小于n, 容斥一下即可 即$ans = \sum\limits ...
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...
- bzoj2242: [SDOI2011]计算器 BSGS+exgcd
你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...