https://daniu.luogu.org/problemnew/show/P2744

滚动数组压去第一维:前i种木桶

f[j] 量取体积j最少需要几种木桶

g[j]  体积j的最优解是否使用了第i种木桶

f[j]= f[j-a[i]] +  g[j-a[i]]^1

输出方案时用搜索,DP检验

g[j] 表示用当前搜索的木桶方案,能否量取体积j

g[j]|=g[j-a[i]]

先对木桶按大小排一次序

搜索的时候从前往后选,第一个合法的方案满足字典序最小

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 201
#define M 20001 int n,m; int a[N]; bool g[M];
int f[M]; int tmp[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void dp()
{
memset(g,false,sizeof(g));
g[]=true;
for(int i=;i<=f[m];++i)
for(int j=a[tmp[i]];j<=m;++j)
if(g[j-a[tmp[i]]]) g[j]=true;
if(g[m])
{
cout<<f[m];
for(int i=;i<=f[m];++i) cout<<' '<<a[tmp[i]];
exit();
}
} void dfs(int x,int sum)
{
if(sum==f[m])
{
dp();
return;
}
if(f[m]-sum>n-x) return;
for(int i=x+;i<=n;++i)
{
tmp[sum+]=i;
dfs(i,sum+);
}
} int main()
{
read(m);
read(n);
for(int i=;i<=n;++i) read(a[i]);
sort(a+,a+n+);
n=unique(a+,a+n+)-a-;
memset(f,,sizeof(f));
f[]=;
bool need;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
g[j]=false;
if(j>=a[i])
{
need=g[j-a[i]]^;
if(f[j-a[i]]+need<=f[j])
{
f[j]=f[j-a[i]]+need;
g[j]=true;
}
}
}
dfs(,);
}

题目描述

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

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

为了量出牛奶,农夫约翰可以从牛奶池把桶装满,然后倒进瓶子。他决不把瓶子里的牛奶倒出来或者把桶里的牛奶倒到别处。用一个容积为 1 夸脱的桶,农夫约翰可以只用这个桶量出所有可能的夸脱数。其它的桶的组合没有这么方便。

计算需要购买的最佳桶集,保证所有的测试数据都至少有一个解。

输入输出格式

输入格式:

Line 1: 一个整数 Q

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

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

输出格式:

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

为了量出想要的夸脱数,需要购买的最少的桶的数量,接着是:

一个排好序的列表(从小到大),表示需要购买的每个桶的容积

输入输出样例

输入样例#1: 复制

16
3
3
5
7
输出样例#1: 复制

2 3 5

说明

题目翻译来自NOCOW。

USACO Training Section 5.3

[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. 【洛谷2744 】【CJOJ1804】[USACO5.3]量取牛奶Milk Measuring

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

  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. 【USACO 5.3.1】量取牛奶 迭代

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

  8. 【USACO 5.3.1】量取牛奶

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

  9. luogu2744 量取牛奶

    题目大意 给出一个整数集合$A$,总数$N$,规定一个整数序列$\{a_n\}, \forall i, a_i\in A$满足条件:存在一个正整数序列$\{k_n\}$,使得$\sum_{i=1}^n ...

随机推荐

  1. github基础操作

    1.最简单实用的操作 更新远程仓库 git status git add . git commit -m "add" git push #git push -u origin ma ...

  2. C++ MOOC

    相关课程列表: C++远征之起航篇 C++远征之离港篇 C++远征之封装篇 上 C++远征之封装篇 下 C++远征之继承篇 C++远征之多态篇 授课老师:james_yuan 在寒假,我主要选择 C+ ...

  3. dsdsd

    #include<iostream> using namespace std; #include<string.h> #define max 205 char map[max] ...

  4. Android界面设计适配不同屏幕的尺寸和密度解读

    Android是运行在各种提供不同的屏幕尺寸和密度的设备.Android系统提供跨设备的统一开发环境和处理大部分的工作,以调整每个应用程序的用户界面,以在其上显示的画面. 同时,该系统提供了API,允 ...

  5. Scrum 项目 3.0

    -------------------------------------3.0----------------------------------------------------- 一.项目工作 ...

  6. 1014 C语言文法定义

    <程序>→<外部声明>|<程序><外部声明><外部声明>→<函数定义>|<声明><函数定义>→<数 ...

  7. 项目复审—Alpha阶段

    项目复审-Alpha阶段 小组的名字和链接 优 点 缺 点 排名 [别看了你没救队]http://www.cnblogs.com/liaoyujun233/p/9016362.html 此队优点很多, ...

  8. Python入门:逻辑判断与运算符

    这是关于Python的第6篇文章,主要介绍下逻辑判断与运算符. (一) 逻辑判断: 如果要实现一个复杂的功能程序,逻辑判断必不可少.逻辑判断的最基本标准:布尔类型. 布尔类型只有两个值:True和Fa ...

  9. Java的checked exception与unchecked exception

    在Java中exception分为checked exception和unchecked异常,两者有什么区别呢? 从表象来看, checked异常就是需要在代码中try ... catch ...的异 ...

  10. UVA10759_Dice Throwing

    求掷骰子n次,点数之和超过m的概率有多大?分数表示. 两种方法: 1.直接DP.用两个数组分别表示分子和分母,注意计算过程中时时约分. 2.将(x1+x2+x3+x4+x5+x6)n多项式展开,把大于 ...