博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU_1059 多重背包问题
阅读量:4973 次
发布时间:2019-06-12

本文共 3342 字,大约阅读时间需要 11 分钟。

F - Dividing
Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u
Submit 

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 marbles had the same value, because then they could just split the collection in half. But unfortunately, some of the marbles are larger, or more beautiful than others. So, Marsha and Bill start by assigning a value, a natural number between one and six, to each marble. Now they want to divide the marbles so that each of them gets the same total value. Unfortunately, they realize that it might be impossible to divide the marbles in this way (even if the total value of all marbles is even). For example, if there are one marble of value 1, one of value 3 and two of value 4, then they cannot be split into sets of equal value. So, they ask you to write a program that checks whether there is a fair partition of the marbles.

Input

Each line in the input file describes one collection of marbles to be divided. The lines contain six non-negative integers n1 , . . . , n6 , where ni is the number of marbles of value i. So, the example from above would be described by the input-line "1 0 1 2 0 0". The maximum total number of marbles will be 20000.
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.

Output

For each collection, output "Collection #k:", where k is the number of the test case, and then either "Can be divided." or "Can't be divided.". 
Output a blank line after each test case.

Sample Input

1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0

Sample Output

Collection #1:Can't be divided.Collection #2:Can be divided. 卡了我有这么久了,终于弄清楚了这道题。。同时也对多重背包有了自己的理解。 多重背包就是为了解决0,1背包在面临大量数据时候的无力。 简言之,多重背包题目是每种物品的数量不止一件,而且可能出奇的多。这时候又像是完全背包,又像是01背包,当然,你完全可以照着01背包的思路写,把大量的同种物品当成一件一件的,但是结果绝对是TLE。 所以多重背包应运而生。 多重背包是这样的:循环每种物品,如果当前物品量*价值 已经大于等于 背包量,那就进行一次完全背包,(因为在有限的背包量时,完全可以把物品量看成无限多)。。。而且完全背包相较而言更为省时。 刚刚吴小珺同学还在纠结为什么这里能用完全背包,再解释一下,就是无论用完全背包还是01背包,目的都是在当前种物品里面,往背包里面塞尽可能多的量。。因此,如果此时物品量足够多,为什么不用完全背包来狠命的往包里塞东西?(怎么塞物品都还有多。。)。。。而且吴小珺同学,这个时候不要纠结能不能恰好放得下,完全背包恰好放不下,那01背包也放不下啊。。我只要求当前状态最优解即可。 ***********************紧跟上面的来讲,如果物品量*价值
#include 
#include
#include
#include
using namespace std;int f[120005];int rec[6];int main(){ int n; int i,j,k; int count=0; while (1) { int sum=0; for (i=0; i<6; i++) { scanf("%d",&rec[i]); sum+=rec[i]*(i+1); } if (!sum) break; printf("Collection #%d:\n",++count); if (sum%2) //如果总量为奇数,根本就不要进行下去,不可能均分。 { puts("Can't be divided."); putchar('\n'); continue; } for (i=0; i<=sum/2; i++) f[i]=0; for (i=0; i<6; i++) { if (!rec[i]) continue; if (rec[i]*(i+1)>=sum/2) //如果可以完全背包,则进行完全背包 { for (int v=i+1; v<=sum/2; v++) if (f[v]
=cur*(i+1); k--) { if (f[k]
=rec[i]*(i+1);k--) //因为模拟下就知道,按上面的01背包,肯定有物品漏掉,此时再补充好漏掉的状态 { if (f[k]

 

 

转载于:https://www.cnblogs.com/kkrisen/p/3232937.html

你可能感兴趣的文章
信息安全学习笔记--XSS
查看>>
ascii
查看>>
POJ - 2723 Get Luffy Out (二分+2-SAT)
查看>>
Wannafly交流赛1 E 迷宫2
查看>>
20145304 实验四实验报告
查看>>
直联和间联的区别——直连和间连的区别
查看>>
mysql多字段模糊查询
查看>>
IIS7日志文件位置
查看>>
SQL锁死解决办法
查看>>
查看mysql数据库的所有配置信息和服务器的各种状态
查看>>
加班快乐
查看>>
All-In-One方式-安装openstack
查看>>
AT 指令和常见错误码
查看>>
Js闭包应用场合,为vue的watch加上一个延迟器
查看>>
Django模板-基础知识
查看>>
Android 系统framework 概述【转载】
查看>>
Spring之JDBC
查看>>
A Simple make file tutorial
查看>>
python之PIL安装问题
查看>>
Python排序算法之冒泡排序
查看>>