题面

Description

农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出。消费者要多少,他就给多少,从不有任何误差。

农夫约翰总是很节约。他现在在奶牛五金商店购买一些桶,用来从他的巨大的牛奶池中量出 Q 夸脱的牛奶。每个桶的价格一样。你的任务是计算出一个农夫约翰可以购买的最少的桶的集合,使得能够刚好用这些桶量出 Q 夸脱的牛奶。另外,由于农夫约翰必须把这些桶搬回家,对于给出的两个极小桶集合,他会选择“更小的”一个,即:把这两个集合按升序排序,比较第一个桶,选择第一个桶容积较小的一个。如果第一个桶相同,比较第二个桶,也按上面的方法选择。否则继续这样的工作,直到相比较的两个桶不一致为止。例如,集合 {3,5,7,100} 比集合 {3,6,7,8} 要好。

为了量出牛奶,农夫约翰可以从牛奶池把桶装满,然后倒进瓶子。他决不把瓶子里的牛奶倒出来或者把桶里的牛奶倒到别处。用一个容积为 1 夸脱的桶,农夫约翰可以只用这个桶量出所有可能的夸脱数。其它的桶的组合没有这么方便。 计算需要购买的最佳桶集,保证所有的测试数据都至少有一个解。

Input

Line 1: 一个整数 Q

Line 2: 一个整数P(1 <= P <= 100),表示商店里桶的数量

Lines 3..P+2: 每行包括一个桶的容积(1 <= 桶的容积 <= 10000)

Output

输出只有一行,由空格分开的整数组成:

为了量出想要的夸脱数,需要购买的最少的桶的数量,接着是:一个排好序的列表(从小到大),表示需要购买的每个桶的容积

Sample Input

16 3 3 5 7

Sample Output

2 3 5

题解

IDDFS

迭代加深搜索。

这道题考虑的桶的个数是第一关键字,很容易想到BFS逐步拓展桶

但是,我们会发现,显然的,内存是开不下的。

那么,我们应该怎么办?

当BFS空间开不下的时候,就要使用迭代加深搜索来代替BFS

而IDDFS的大致步骤是:

确定深度

搜索

超过深度就返回

但是

这期间是不是就要大量的东西重复计算了呀,

那要怎么办?

请记住,对于IDDFS而言,加深深度之后拓展出来的节点和原来的总节点个数相比,重复搜索的部分简直不值一提

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 200
#define rg register
int Q,p;
int v[MAX];//体积
bool fl=false;//标记是否找到解
int dep;//指定的深度
int C[MAX];//记录选定的桶
bool f[MAX*MAX];//DP用
inline bool ok()
{
//memset(f,0,sizeof(f));
for(rg int i=1;i<=Q;++i)
f[i]=false;
f[0]=true;
for(rg int i=1;i<=Q;++i)
for(rg int j=0;j<dep&&!f[i];++j)
if(i>=C[j])
f[i]|=f[i-C[j]];
else
break;
return f[Q];
}
inline void outp()
{
cout<<dep<<' ';
for(rg int i=0;i<dep;++i)
cout<<C[i]<<' ';
cout<<endl;
}
void DFS(rg int x,rg int tot)//上个桶的编号以及已经选的桶的数量
{
if(tot==dep)
{
if(ok())
{
outp();
fl=true;
}
return;
}
for(rg int i=x+1;i<=p&&!fl;++i)
{
if(p-i+1<dep-tot)//桶的个数不够到达指定深度
break;
C[tot]=v[i];
DFS(i,tot+1);
C[tot]=0;
}
}
int main()
{
scanf("%d%d",&Q,&p);
for(rg int i=1;i<=p;++i)
scanf("%d",&v[i]);
sort(&v[1],&v[p+1]);
for(rg int i=1;i<=p;++i)//迭代加深
{
dep=i;//最大深度
DFS(0,0);
if(fl)break;
}
return 0;
}

【洛谷2744 】【CJOJ1804】[USACO5.3]量取牛奶Milk Measuring的更多相关文章

  1. 洛谷 P2744 [USACO5.3]量取牛奶Milk Measuring

    P2744 [USACO5.3]量取牛奶Milk Measuring 题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最 ...

  2. 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring

    题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位--译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有 ...

  3. [USACO5.3]量取牛奶Milk Measuring

    https://daniu.luogu.org/problemnew/show/P2744 滚动数组压去第一维:前i种木桶 f[j] 量取体积j最少需要几种木桶 g[j]  体积j的最优解是否使用了第 ...

  4. luogu P2744 [USACO5.3]量取牛奶Milk Measuring

    题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有 ...

  5. [luoguP1494] 岳麓山上打水 && [luoguP2744] [USACO5.3]量取牛奶Milk Measuring

    传送门 传送门 dfs选取集合,dp背包判断 虽然我觉的会TLE.. 但是的确是AC了 #include <cstdio> #include <cstring> #includ ...

  6. [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)

    题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...

  7. 【洛谷1345】 [USACO5.4]奶牛的电信(最小割)

    传送门 洛谷 Solution emmm,直接对于每一个点拆点就好了. 然后边连Inf,点连1,跑最小割就是答案. 代码实现 #include<bits/stdc++.h> using n ...

  8. 【USACO 5.3.1】量取牛奶 迭代

    Description 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就 ...

  9. 【USACO 5.3.1】量取牛奶

    农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有任何误差. ...

随机推荐

  1. MongoDB - Indexing, Replication, and Security

    Introduction of Indexes: 1> Provide high performance 2> Provide efficient execution to queries ...

  2. 安装RabbitMQ(二)

    RabbitMQ的简易安装 前一篇博文的RabbitMQ安装有点复杂,经过搜索发现简单的安装方式如下. 1.Erlang Yum Repos 基于 SSL 高版本包含插件 rpm -Uvh http: ...

  3. egametang网络系统组件

    先看一下网络组件的中层: AService抽象了udp和tcp协议的连接工厂,udp的连接方式也被封装的和tcp类似,但是一个接收连接的UService只能建立一个连接.这个接口既可以做服务端通过Ac ...

  4. linux 管理权限

    linux 管理权限 linux 文件 权限 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- 2 root adm 4096 2013-08-07 11:03 ...

  5. RHEL6误安装RHEL7的包导致glibc被升级后系统崩溃处理方法

    RHEL6误使用了RHEL7的光盘源,安装了某个RPM包之后,导致glibc被升级,进而导致系统崩溃.   [root@rhel65 ~]# yum install ftp Loaded plugin ...

  6. 一个简单清晰的Redis操作类

    <?php /** * redis处理的二次封装 * */ class Redis{ private $_redis; private $_config; public function __c ...

  7. 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...

  8. Activity工作过程

    Activity工作过程: Activity.startActivity--> Activity.startActivityForResult--> Instrumentation.exe ...

  9. mysql 学习心得5

    常用函数 字符串函数 concat(S1,S2....,Sn) 链接s1 s2 ...... 任何字符串和null链接显示为null insert(str,x,y,instr)  将str从x位开始y ...

  10. Activity的生命周期& 启动模式

    1.Activity的生命周期 生命周期这个事情,是android工程师最基础的知识,所以今天要讲的是一些不一样的东西. 1.1 OnStart,OnResume,OnPause,OnStop 他们的 ...