【CodeVS 1014】装箱问题
题目描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
分析
思路1:判定性dp
设表示用了前n个物品,能否达到容量j。
然后对取最大的就可以了。
思路2:偏离搜索
我们有种很好的思想:贪心。
先排序,然后每次尽可能取最大的。
但是这样是错误的。
我们考虑调整。
我们坚定几乎都是取最大的。
所以使用偏离搜索:只有限定次数能不取最大的。
结合一个剪枝:若之后的sum+当前的s<=v,则直接取完。
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
const int N=32;
const int D=5;
int v,n;
int a[N];
int sum[N];
int res;
inline int rd(void)
{
int x=0,f=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
void DFS(int w,int del,int s)
{
if (s+sum[w]<=v)
{
res=max(res,s+sum[w]);
return;
}
if (s+a[w]<=v)
{
DFS(w-1,del,s+a[w]);
if (del<D) DFS(w-1,del+1,s);
}
else DFS(w-1,del,s);
}
int main(void)
{
freopen("codevs1014.in","r",stdin);
freopen("codevs1014.out","w",stdout);
v=rd(),n=rd();
rep(i,1,n) a[i]=rd();
sort(a+1,a+n+1);
rep(i,1,n)
sum[i]=sum[i-1]+a[i];
DFS(n,0,0);
printf("%d\n",v-res);
return 0;
}
思路3:随机化
我们有种很好的思想:贪心。
先排序,然后每次尽可能取最大的。
但是这样是错误的。
我们考虑不排序了。
多次随机序列,然后能取就取。
随机1000000次即可。
#include <cstdio>
#include <cctype>
#include <climits>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
const int N=32;
const int T=1000000;
const int MAX=INT_MAX;
int v,n;
int a[N];
int res;
inline int rd(void)
{
int x=0,f=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int Calc(void)
{
int nv=0;
rep(i,1,n)
if (nv+a[i]<=v)
nv+=a[i];
return v-nv;
}
int main(void)
{
// freopen("codevs1014.in","r",stdin);
// freopen("codevs1014.out","w",stdout);
v=rd(),n=rd();
rep(i,1,n) a[i]=rd();
res=MAX;
rep(tms,1,T)
{
random_shuffle(a+1,a+n+1);
int t=Calc(); res=min(res,t);
}
printf("%d\n",res);
return 0;
}
小结
(1)伪判定性问题
我们称“是不是”这种问题为判定性问题。
而很多最值问题都可以通过判定性问题来表述,所以称这类问题为伪判定性的。
总之:许多判定性问题可以转化为最值问题。
(2)骗分的思路
骗分要有思路才行。
常规的骗分被称为“老实的骗分”,常见dfs求解,再结合两个常见的剪枝:①ans>=sum ②now+rest<=v
但是,有时候我们假如能想到一些错误的贪心,那么就可以诞生一些很棒的方法。常见方法1:偏离搜索。常见方法2:随机排列顺序,这种方法可用于最大团的求解。
总之,要活学活用,具体题目还是要具体分析。
【CodeVS 1014】装箱问题的更多相关文章
- Codevs 1014 装箱问题
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...
- codevs 1014 装箱问题 2001年NOIP全国联赛普及组
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...
- 【动态规划】【零一背包】CODEVS 1014 装箱问题 2001年NOIP全国联赛普及组
#include<cstdio> #include<algorithm> using namespace std; ],f[]; int main() { scanf(&quo ...
- wikioi 1014 装箱问题
来源:http://wikioi.com/problem/1014/ 1014 装箱问题 29人推荐 收藏 发题解 提交代码 报错 题目描写叙述 输入描写叙述 输出描写叙述 例子输入 例子输出 提示 ...
- 1014 装箱问题 CODE[VS]
1014 装箱问题 2001年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descripti ...
- codevs 3152 装箱问题3
装箱问题3 http://codevs.cn/problem/3152/ 题目描述 Description 设有n种物品,记作A1.A2.….An,对应于每个Ai(1<=i<=n)都有一个 ...
- 【wikioi】1014 装箱问题
题目链接 算法:动态规划(01背包) 01背包思想:依次对待某一物体,考虑是否放入容量为V的背包中 用f[V]来表示容量为V的背包的最大价值,则决策是 f[V] = max{f[V], f[V-v[i ...
- codevs 1464 装箱问题 2
题目描述 Description 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6.这些产品通 ...
- wikioi 1014 装箱问题(背包)
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...
随机推荐
- ContentProvider官方教程(9)定义一个provider完整示例:实现方法,定义权限等
Creating a Content Provider In this document Designing Data Storage Designing Content URIs Implement ...
- JavaScript运算符
JavaScript运算符 1.算数运算符 设定a = 5. 运算符 描述 例子 结果 + 加 b=a+2 b=7 - 减 b=a-2 b=3 * 乘 b=a*2 b=10 / 除 b=a/2 b=2 ...
- drawRect导致内存暴增的真正原因
那么现在我们分析一下drawRect导致内存暴增的真正原因: 重写drawRect为何会导致内存大量上涨? 要想搞明白这个问题,我们需要撸一撸在 iOS 程序上图形显示的原理.在 iOS 系统中所有显 ...
- netstat 的10个基本用法
Netstat 简介 Netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字. ...
- MTK6589下传感器框架结构和代码分析以及传感器的参数指标
MTK6589下传感器框架结构和代码分析以及传感器的参数指标 作者:韩炜彬 中国当代著名嵌入式研究专家 一. 模块框架 1)配置 路径:Alps/mediatek/config/$(pro ...
- UPC 2170 D Equal Is Not Really Equal (欧拉路径)
题目链接:http://acm.upc.edu.cn/problem.php?id=2170 题意:给出一个字符串,比如ABACA,在这个串里,AB.BA.AC.CA各出现一次.若存在另外一个串,里面 ...
- Cheatsheet: 2013 08.20 ~ 08.31
.NET Protobuf-net: the unofficial manual 5 Common C# Misconceptions What is new in the Mono project ...
- git -C
https://git-scm.com/docs/git -C <path> Run as if git was started in <path> instead of th ...
- 领域驱动设计系列文章——浅析VO、DTO、DO、PO的概念、区别和用处
本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...
- maven2 配置M2_REPO
从eclipse中增加了maven2的插件之后,maven默认的本地库的路径是${user}/.m2/repository/下,一般windows用户的操作系统都安装在C盘,所以这个目录 下的jar包 ...