[PA 2014]Pakowanie
Description
你有n个物品和m个包。物品有重量,且不可被分割;包也有各自的容量。要把所有物品装入包中,至少需要几个包?
Input
第一行两个整数n,m(1<=n<=24,1<=m<=100),表示物品和包的数量。
第二行有n个整数a[1],a[2],…,a[n](1<=a[i]<=10^8),分别表示物品的重量。
第三行有m个整数c[1],c[2],…,c[m](1<=c[i]<=10^8),分别表示包的容量。
Output
如果能够装下,输出一个整数表示最少使用包的数目。若不能全部装下,则输出NIE。
Sample Input
4 2 10 3
11 18 9
Sample Output
题解
狗屎因为数组开小了,导致调了一个多小时...
首先我们有贪心的思想就是背包肯定是从大往小选。
再接着由于物品数$n<=24$,我们可以拿来状压。
设$f[S]$表示当前物品集合为$S$,且当前背包所用容量为$f[S]$,$g[S]$为当前背包的编号,也就是背包数量。
那么每次我们可以枚举一个物品加进来,如果没有炸掉当前背包,就可以直接填进去,否则就要开一个新背包,如果连新背包都开不下,那么这个转移就是不合法的。(参考wfj_2048)
//It is made by Awson on 2017.10.15
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define lowbit(x) ((-(x))&(x))
using namespace std;
const int N = <<;
const int INF = ~0u>>;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
} int n, m, st[N+];
int a[], c[];
int f[N+], g[N+]; bool comp(const int &q, const int &p) {
return q > p;
} void work() {
read(n), read(m);
memset(f, -, sizeof(f));
for (int i = ; i < n; i++) read(a[i]), st[<<i] = i;
for (int i = ; i <= m; i++) read(c[i]); sort(c+, c+m+, comp);
for (int i = ; i < n; i++) if (a[i] <= c[]) f[<<i] = c[]-a[i], g[<<i] = ;
for (int i = , lim = <<n; i < lim; i++) {
if (f[i] == -) f[i] = g[i] = INF;
for (int t = i, j = i-lowbit(t); t && j; t -= lowbit(t), j = i-lowbit(t)) {
if (f[j] == INF) continue;
int bit = st[lowbit(t)];
int ff, gg;
if (f[j] >= a[bit]) ff = f[j]-a[bit], gg = g[j];
else ff = c[g[j]+]-a[bit], gg = g[j]+;
if (ff < ) continue;
if (gg < g[i]) f[i] = ff, g[i] = gg;
else if (gg == g[i] && f[i] < ff) f[i] = ff;
}
}
if (f[(<<n)-] == INF || g[(<<n)-] > m) printf("NIE\n");
else printf("%d\n", g[(<<n)-]);
}
int main() {
work();
return ;
}
[PA 2014]Pakowanie的更多相关文章
- [PA 2014]Lustra
		
Description Byteasar公司专门外包生产带有镜子的衣柜.刚刚举行的招标会上,有n个工厂参加竞标.所有镜子都是长方形的,每个工厂能够制造的镜子都有其各自的最大.最小宽度和最大.最小高度. ...
 - [PA 2014]Kuglarz
		
Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+ ...
 - [PA 2014]Bohater
		
Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降 ...
 - [PA 2014]Iloczyn
		
Description 斐波那契数列的定义为:k=0或1时,F[k]=k:k>1时,F[k]=F[k-1]+F[k-2].数列的开头几项为0,1,1,2,3,5,8,13,21,34,55,…你 ...
 - 解题:PA 2014 Bohater
		
题面 我们把怪分成两类,打完了了能回血的和打完了不能回血的,然后分开打. 对于能回血的,我们先打攻击力低的,因为如果先打一个攻击力高的显然不一定能直接打过,所以先打一些攻击力低的回回血. 对于不能回血 ...
 - bzoj 3714 [ PA 2014 ] Kuglarz —— 思路+最小生成树
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3714 因为每个杯子下最多一个小球,所以从奇偶性就可以看出有没有球: 询问一段区间,等于知道一 ...
 - 【PA 2014】Kuglarz
		
[题目链接] 点击打开链接 [算法] sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数 那么,知道[i,j]这段区间中,藏有球的 ...
 - 2014年第五届蓝桥杯C/C++程序设计本科B组决赛
		
1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...
 - PA模块报错-实际返回的行数超出请求的行数(分析标准FORM报错解决思路)
		
录入预算报错时报错: 分析:这个错误是select into 语句返回多行的结果,但具体在哪? 两种方法查找,trace 或者debug 1.trace 启用调试 获取trace文件 -bash-3. ...
 
随机推荐
- TCP和UDP的最完整的区别
			
TCP UDP TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少: 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); ...
 - tornado 采用 epoll 代理构建高并发网络模型
			
1 阻塞和非阻塞 对于阻塞和非阻塞,网上有一个很形象的比喻,就是说好比你在等快递,阻塞模式就是快递如果不到,你就不能做其他事情.非阻塞模式就是在这段时间里面,你可以做其他事情,比如上网.打游戏.睡觉 ...
 - 03-移动端开发教程-CSS3新特性(下)
			
1. CSS3动画 1.1 过渡的缺点 transition的优点在于简单易用,但是它有几个很大的局限. transition需要事件触发,所以没法在网页加载时自动发生. transition是一次性 ...
 - css中的em 简单教程 -- 转
			
先附上原作的地址: https://www.w3cplus.com/css/px-to-em 习惯性的复制一遍~~~~ -------------------------------我是分界线---- ...
 - js 获取 最近七天 30天 昨天的方法 -- 转
			
自己用到了 找了下 先附上原作的链接 http://www.cnblogs.com/songdongdong/p/7251254.html 原谅我窃取你的果实 谢谢你谢谢你 ~ 先附上我自己用到 ...
 - Spring源码情操陶冶#task:scheduled-tasks解析器
			
承接前文Spring源码情操陶冶#task:executor解析器,在前文基础上解析我们常用的spring中的定时任务的节点配置.备注:此文建立在spring的4.2.3.RELEASE版本 附例 S ...
 - Python内置函数(6)——round
			
英文文档: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits afte ...
 - NoSQL&MongoDB
			
MongoDB: Is NoSQL(技术的实现,并非是一个特定的技术,与RMDS对立):Not only SQL 大数据问题:BigData,eg:同时访问几个页面,代码实现几个页面访问量的大小? F ...
 - 说说Java代理模式
			
代理实现可以分为静态代理和动态代理. 静态代理 静态代理模式其实很常见,比如买火车票这件小事:黄牛相当于是火车站的代理,我们可以通过黄牛买票,但只能去火车站进行改签和退票.在代码实现中相当于为一个委托 ...
 - 运维-替换kibana徽标
			
作为一名纯运维人员,想更改kibana的徽标. 并不能像开发一样去看源码并修改源码. 所以我们可以替换徽标. 先来一个效果图.我的版本是5.5.1. 具体的修改过程: 在kibana安装路径下面. o ...