题目如下:
对于每一组样例,给你六种玻璃球,每种有着不同的价值,现在问你,你能否在不拆分同一颗玻璃球价值的同时分成价值相同的两份?


#include<stdio.h>
#include<string.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n1=0,a[120001],cost[101],value[101],sum=0,num[7];
int main()
{int time=0;while(1){sum=0;n1=0;for(int i=1;i<=6;i++){scanf("%d",num+i);sum+=num[i]*i;}if(sum==0) break;if(sum%2==1){printf("Collection #%d:\n",++time);printf("Can't be divided.\n\n");continue;}memset(a,0,sizeof(a));for(int i=1;i<=6;i++){int s=num[i],t=1;while(s>=t){if(t*i){cost[++n1]=t*i;value[n1]=t*i;}s-=t;t*=2;}if(s*i){cost[++n1]=s*i;value[n1]=s*i;}}for(int i=1;i<=n1;i++){for(int j=sum/2;j>=cost[i];j--){a[j]=max(a[j],a[j-cost[i]]+value[i]);}}if(sum/2==a[sum/2]) {printf("Collection #%d:\n",++time);printf("Can be divided.\n\n");}else {printf("Collection #%d:\n",++time);printf("Can't be divided.\n\n");}}}

1.对于多重背包,首先要进行二进制优化。如果是0颗该种玻璃球,则直接忽略过去。(代码中的if(ti),if(si));
2.对于广泛的背包问题,如维护了一个a[1000]的数组,那么下标为x,就严格地代表x这个容量下最多可以容纳最多a【x】价值的东西。
之前的错误理解在于,譬如说01背包的逆序,是盲目的进行“拿不拿”的判断,而之前的状态不论存在与否。这是错误的。当维护出来a【x】时,哪怕a【x-cost【i】】不涉及该状态,那么其也应该不小于第x变量前面“设计状态”的价值。
举个例子。
我现在有重量和价值分别为1,5,6的玻璃球。
我要维护一个背包数组。
先考虑价值为6的玻璃球,维护后:
0 0 0 0 0 6 6 6 6 6 6 6
再考虑价值为5的玻璃球
0 0 0 0 5 6 6 6 6 6 11 11
再考虑价值为1的玻璃球
0 1 1 1 5 6 7 7 7 7 11 12
你品 你细品。
3.定义:
若使得价值==重量,进而
若维护出来一个背包数组a【13】,若对于下标为x的变量a【x】,如果在x这个容量下,塞下物品的重量恰好是x,则称为“真装填”,否则称之为“假装填”。
举个例子。我要装填重量分别为2,4,5的三件物品。则容量为11的背包能够容纳,则a【11】为真装填。但是如果给你一个a【12】的背包,多出的一个容量啥用没有,只能顺承容量为11时背包的数据,则这就是假装填。
这个原理可以应用于判断物品装载可不可能恰好到达一个容量v(真装填)。
这一道题就是这样。如果判断出sum/2= =a[sum/2],则认定为在sum/2容量下能够真装填,则可以分开。
也可以这样理解:等于重量的value是“背包实际装载量”,而下标x的容量为“最大装载量”,当且仅当背包实际装载量等于最大装载量时,是真装载。

关于多重背包理解的一点思考和拨乱反正相关推荐

  1. 01背包,完全背包,多重背包的个人总结

    大一刚接触背包问题的时候就觉得绕.那时候真的是一点代码基础都没有强行去理解.每次都是以失败告终,一直到大二都还不会写背包问题. 后来某次模拟赛之后碰到了背包问题,觉得这个还是挺简单的,终于是下定决心准 ...

  2. 动态规划-----------01背包,完全背包与多重背包

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  3. 多重背包单调队列优化思路_动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专题的第三篇. 在之前的文章当中,我们介绍了多重背包的二进制拆分的解法.在大多数情况下,这种 ...

  4. 动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专题的第三篇. 在之前的文章当中,我们介绍了多重背包的二进制拆分的解法.在大多数情况下,这种 ...

  5. HDU 2079 选课时间(题目已修改,注意读题) 母函数 || 多重背包

    今天做这题才知道原来母函数的原型不是从第二个括号开始,那不过是优化而已,除了1^n,2^n那种类型可以从2开始外其他都要从1开始.好了,上代码吧. #include<stdio.h> in ...

  6. 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  7. 九十、动态规划系列背包问题之多重背包

    @Author:Runsen 曾几何时,才记得自己还是大一军训的菜鸟,带着 迷茫和憧憬踏入大学,踏入化工学院,却踏入这个行业,殊不知岁月是最高明的小偷,偷走时间,带走青春,一点线索也不留.大学的玩命学 ...

  8. (step3.3) hdu 1059(Dividing——多重背包)

    题目大意:分别给出价值为1~6的石头的数量.问能否将这些石头等价值平分... 解题思路:多重背包 1)多重背包的典型描述是这样的:给出n种物品,背包的容量为V.每种物品的可用数量为num[i],所占体 ...

  9. POJ - 2392 朴素多重背包 + 贪心 WA与AC代码细节分析

    我们先来看下普通的朴素多重背包(拆成01背包求解) n种物品,背包大小w,每种物品重量 wi,价值 vi,个数 ci dp[j] 表示 大小为 j 的背包含有的最大价值,即 物品重量和 小于等于 j ...

最新文章

  1. spi时序图怎么分析,怎么看懂spi时序图
  2. python --error整理(不定时更新)
  3. 大数据下Limit使用(MySQL)
  4. Android Studio签名打包的两种方式
  5. linux 快照备份导出,KVM之虚拟机几种备份方法(快照/克隆/导出)
  6. l源码安装mysql升级_[Linux]javaEE篇:源码安装mysql
  7. 淘宝内部大量使用的开源系统监控工具
  8. pom.xml增加依赖
  9. php中命名空间、面向对象、访问控制、接口
  10. python3 urllib模块
  11. RAC安装时,报The specified nodes are not clusterable 的解决方法
  12. 介绍一款国际性的本体社群聊天软件Discord
  13. 新联想ISG聚焦新IT,全要素推进企业智能化转型
  14. FTP原理和修改FTP默认端口
  15. Linux系统修改网卡名称(eth1修改为eth0)
  16. 干货分享:5年SEO经验得来的101条总结
  17. 站内搜索功能的几种实现方式
  18. 现代信息系统主要是基于计算机的,科学网—管理信息系统建设导论 - 张利华的博文...
  19. 已经买好了域名后怎么建立一个网站
  20. 【转自果壳】学习没有“关键期”,现在开始就不晚

热门文章

  1. 操作系统课后答案 第四--六章 黑新宏 胡元义主编
  2. 各种题材的手游游戏代码素材推荐,不容错过
  3. Pointproofs 学习笔记3——代码解析
  4. win10休眠_Win10系统C盘飘红,6招瞬间腾出十几GB空间
  5. # [1007]魔法少女小Scarlet
  6. 关于WIN10“网络重置”后连不上网的解决方法
  7. python——洗牌算法
  8. 基于SSM的仓储管理系统
  9. NMEA GPRMC 格式图解,NMEA 工具的比较
  10. java开发工具的下载和破解