HDU 1059 Dividing

PWM调光原理详解:为什么你的LED灯会闪烁?从硬件到软件的避坑指南 本文深入解析PWM调光原理,揭示LED灯闪烁的根本原因,并提供从硬件设计到软件算法的全面解决方案。通过分析人眼视觉暂留机制和PWM参数设置,帮助开发者避免频闪问题,提升照明质量。特别适合电子工程师和智能家居开发者参考。 阅读详情

题目大意:Marsha and Bill准备平分他们共同的收集物:marbles;求能否做到完全平分.相同价值的marbles可能有多个.

思路:多重背包问题.但是要优化,直接转化为01背包因为:O(7*20000*60000),必定tie了!所以必定得优化,但是单调队列优化的算法不会,只好把用二进制优化的多重背包模板摸过去..下面蓝色字部分来自<背包九讲>.其中红色部分是算法优化核心..

转化为01背包问题

另一种好想好写的基本方法是转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的01背包问题,直接求解,复杂度仍然是O(V*Σn[i])。

但是我们期望将它转化为01背包问题之后能够像完全背包一样降低复杂度。仍然考虑二进制的思想,我们考虑把第i种物品换成若干件物品,使得原问题中第i种物品可取的每种策略——取0..n[i]件——均能等价于取若干件代换以后的物品。另外,取超过n[i]件的策略必不能出现。

方法是:将第i种物品分成若干件物品,其中每件物品有一个系数,这件物品的费用和价值均是原来的费用和价值乘以这个系数。使这些系数分别为1,2,4,...,2^(k-1),n[i]-2^k+1,且k是满足n[i]-2^k+1>0的最大整数。例如,如果n[i]为13,就将这种物品分成系数分别为1,2,4,6的四件物品。

分成的这几件物品的系数和为n[i],表明不可能取多于n[i]件的第i种物品。另外这种方法也能保证对于0..n[i]间的每一个整数,均可以用若干个系数的和表示,这个证明可以分0..2^k-1和2^k..n[i]两段来分别讨论得出,并不难,希望你自己思考尝试一下。

 

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[120010];
int n[7];
int v;
void ZeroOnePack(int cost,int weight)
{
   for(int i=v;i>=cost;i--)
      if(dp[i]<dp[i-cost]+weight)
            dp[i]=dp[i-cost]+weight;
             
}
void CompletePack(int cost,int weight)
{
  for(int i=cost;i<=v;i++)
      if(dp[i]<dp[i-cost]+weight)
           dp[i]=dp[i-cost]+weight; 
        
}
//在这里碰巧"价值就是花费",所以数值上相同. 但之所以用两变量代替,就是区分意义 
void MultiplePack(int cost ,int weight,int amount)
{
     if(cost*amount>=v)//对于一种物品如果其花费*数量>=体积,可以看成是完全背包来解决问题 
          CompletePack(cost,weight); 
     else
     {
          for(int k=1;k<amount;)//利用2进制对枚举的物品数量进行压缩 
          {
               ZeroOnePack(k*cost,k*weight);
               amount-=k;
               k<<=1;      
          }  
          ZeroOnePack(amount*cost,amount*weight); 
          //对利用二进制优化之后剩下的数不足以继续二进制的数进行最后一次01背包的演算 
     }
}
int main()
{
int cas=1;
while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6])!=EOF,n[1]+n[2]+n[3]+n[4]+n[5]+n[6])
{
       
     
      int sumValue=0;
      for(int i=1;i<=6;i++)
              sumValue+=n[i]*i;     
      if(sumValue&1)
          { 
               printf("Collection #%d:\nCan't be divided.\n\n",cas++);
               continue;
          }
      v= sumValue/2;  
      memset(dp,0,sizeof(dp));
      for(int i=1;i<=6;i++)
          MultiplePack(i,i,n[i]);
      if(dp[v]==v)
         printf("Collection #%d:\nCan be divided.\n\n",cas++); 
      else
           printf("Collection #%d:\nCan't be divided.\n\n",cas++);                                            
}    
return 0;}


 

 

 

第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) 大家好,我是cuiwin!本节内容,我们从零开始开发基于Python(Flask)的后端项目,对接Vue Vben Admin(vben5)。登录mysql数据库执行: 创建数据库。 阅读详情

相关推荐

nnUnet代码解读--优化策略

优化策略 nnUNetTrainer def initialize_optimizer_and_scheduler(self): assert self.network is not None, "self.initialize_network must be called first" self.optimizer = torch.optim.Adam(self.network.parameters(), self.initial_lr, weight_decay=self.weight_

weixin_44858814的博客 3824

2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest(Dividing Marbles-构造)

有一堆n=2d1+2d2+2d3+2d4n=2^{d_1}+2^{d_2}+2^{d_3}+2^{d_4}个石子。现在每次操作都选择一堆,分成两堆,使每堆至少有一颗石子,之后如果场上有相同数量的石子堆,则只保留一堆。问至少几次操作使石子只剩1个。 显然可以先将n化成2进制。 如果1的个数不超过3,可以这样 10101 10101->10000 +100 +1 //2步 10000 -> 10

nike0good |Oier&ACMer | 熟能生巧 1633

Win11用户文件夹中文名修改全攻略

本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。

Qinti_mm的博客 3123

2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest D Dividing Marbles

题目大意: 给出一个$N(N <= 2^{22}$),$N$的二进制表示中1的个数不超过4. 一开始有一个集合$S = {N}$, 每次操作可以选择$n\in S \ (n > 1)$, 将$n$拆成两个正整数$n_1$和$n_2$,$n = n1 + n2$, 然后令$S = \{S \setminus n\} \cup \{n_1, n_2\}$. 问最少多少次操作...

dehs8915的博客 336

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 636

SoC芯片时钟树优化实战:如何用分段CTS解决DDRPHY与Memory Controller的时序难题

本文深入探讨了SoC芯片时钟树优化中的分段CTS技术,重点解决DDRPHY与Memory Controller之间的时序难题。通过分析多域时钟架构的复杂性,提出三级分段CTS策略,并结合28nm移动SoC实战案例,展示如何通过Guide Buffer插入和本地段重构实现72%的跨域偏差改善。文章还涵盖5nm以下工艺的线阻变异、热梯度效应等特殊考量,为数字IC设计提供时钟树综合的高阶解决方案。

kkk56的博客 905

Dividing(多重背包)

Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54064   Accepted: 13818 Description Marsha and Bill own a collection of marbles. They want to split the co...

Simone chou... 240

基于深度强化学习技术优化无线网络中的资源分配(一)DQN部分代码

这是一个GitHub上的开源项目,链接:https://github.com/alexis-anzaldo/Deep-Reinforcement-Learning-for-resource-allocation-in-wireless-networks该项目旨在通过深度强化学习DQL技术优化无线网络中的资源分配,特别关注小型蜂窝和超密集无线蜂窝网络中的功率控制问题,主要目标是提高DRL模型的学习效率和网络吞吐量。

m0_46292040的博客 1537

Dividing (多重背包 动态规划)

Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same

J____xueming的博客 1048

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4653

RDKit | 基于Murcko骨架聚类化合物库

化合物多样性评估 一种方法是使用合适的指纹技术将化合物矢量化并评估他们之间的距离。这种方法经常被使用,但是对于人类很难直观地理解化合物之间的距离。 基于Murcko骨架,分子大致聚集在化合物骨架中,并且每个簇中的顶部化合物都作为候选化合物。此方法非常符合人类的直觉,因此可以预期人将通过查看候选化合物列表来自动缩小化合物的范围。 Murcko骨架 Mur...

DrugOne 3766

(多重背包)HDU1059Dividing

HDU1059Dividing 题意&思路: 给你质量为1~6的宝石的个数,问能不能等分。 对于总质量为奇数的肯定不能等分,对于质量为偶数的,只要dp[m]==m(m=sum/2)就可以等分,这样就是多重背包问题了。坑点是输出格式,要两个换行。 代码: #include<bits/stdc++.h> const int N=1e5+10; const int mod=1e7+9...

Z7784562的博客 182

【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应

最近项目中需要用到大疆无人机遥控器对程序中无人机进行控制,遥控器是下图这一款:博主发现接入手柄这块的可以参考的内容非常少,对于大疆遥控器的控制更是没有。博主经过一番研究,终于理通了这块的遥控器摇杆数据的控制。并且将解决思路分享出来,希望对大家有所帮助。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2819

[0-1背包]HDU 1059 Dividing

HDU1059 Dividing 原题链接http://acm.hdu.edu.cn/showproblem.php?pid=1059 0-1背包问题 动态规划

昨天的我现在的未来 440

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

HDU 1059 Dividing(多重背包)

HDU 1059 Dividing(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意: 现在有价值为1,2,3,4,5,6的6种物品, 它们的数量为num[i]( 1<=i<=6 )个. 现在要问的是能否把所有的的物品分成两份且这两份物品的价值总和相同 ? 分析: 首先我们求出所有物品的价值和sum_val, 如果sum_val是奇数, 那么明显不能分. 那么sum_val为偶时, 我们令m=sum_val/2. 我能

code 1186

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

hdu 1059 Dividing

Hdu链接 文章目录题目描述题意:题解:代码: 题目描述 输入描述: 输出描述: 示例1 输入 1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0 输出 Collection #1: Can't be divided. Collection #2: Can be divided. 题意: 有价值分别是1~6的6种大理石,每种大理石的数量是ni,问能否将这些大理石分成完全相同的两部分? 题解: 这个题和hdu 2844 Coins做法基本一样,不过本题要稍微转变下思路 我们

qq_35975367的博客 480

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

HDU Dividing 1059

Problem Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the

zyq_19960204的博客 394

hdu1059 Dividing

题目:       http://acm.hdu.edu.cn/showproblem.php?pid=1059  或  http://poj.org/problem?id=1014      多重背包,注意(比较大小)要用手写,不要调函数,在hdoj上交,会发现时间花费很大    #include int dp[120005]; int V,v; //01背包, c表示花费, w

夏天的风 2918

HDU1059Dividing

题目大意: 给你6种石头,包括每种石头的个数,求是否可以将这些石头平分 ....................................... 这题很简单的多重背包!!! 具体有多简单? 一般的多重背包用暴力肯定超时!!! 然而这道题用暴力稍微优化一点点不会超时!!!!! 然而我超时!!! 我用的多重背包超时了!!! exm?? 暴力AC代码: #include #

wjhshuai的博客 338

hdu 1059&&POJ 1014 Dividing

hdu   1059   Dividing                  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题目大意:有六种石头,价值分别为1~6,给出每种石头的个数,问能否分成价值相等的两份。 题目分析:多重背包水无坑。 code: #include #include int main() { int i,j,k

slicer的技术交流栈 830

HDU - 1059 Dividing

01背包 + 二进制拆分 [题目链接]

weixin_44354699的博客 377
上一篇: HDU 1171 Big Event in HDU
下一篇: HDU2844 Coins
muximuxi525
博客等级 码龄15年 134粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值