农夫约翰要量取 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

输出只有一行,由空格分开的整数组成: 
为了量出想要的夸脱数,需要购买的最少的桶的数量,接着是:一个排好序的列表(从小到大),表示需要购买的每个桶的容积

题解:
这个题目做法有很多,可以通过对筒子取魔来知道所枚举筒子的范围,最后加个最优性剪枝就可以了,代码参考大牛们的博客,
我是用迭代深搜,限制筒子的数目,把筒子枚举出来之后跑一个完全背包来check打的。代码如下:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[];
int tong[];
int use[];
bool b[];
int q,p,flag=;
bool judge(int num){
dp[]=;
for(int i=;i<=q;i++) dp[i]=;
for(int i=;i<=num;i++){
for(int j=use[i];j<=q;j++){
dp[j]=dp[j]|dp[j-use[i]];
}
}
if(dp[q]==) return ;
return ;
}
void print(int num){
printf("%d ",num);
sort(use+,use+num);
for(int i=;i<=num-;i++){
printf("%d ",use[i]);
}
}
void dfs(int now,int top){
if(now==top){
if(judge(top-)){
print(top);
exit();
}
return;
}
for(int i=;i<=p;i++){
if(b[i]) continue;
b[i]=;
use[now]=tong[i];
dfs(now+,top);
b[i]=;
use[now]=;
}
}
int main(){
memset(dp,,sizeof(dp));
memset(use,,sizeof(use));
memset(b,,sizeof(b));
scanf("%d%d",&q,&p);
for(int i=;i<=p;i++){
cin>>tong[i];
}
sort(tong+,tong+p+);
for(int top=;top<=p;top++){
memset(b,,sizeof(b));
dfs(,top);
}
return ;
}
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<algorithm>
  5. #include<cstring>
  6. usingnamespace std;
  7. int dp[20010];
  8. int tong[110];
  9. int use[110];
  10. bool b[110];
  11. int q,p,flag=0;
  12. bool judge(int num){
  13. dp[0]=1;
  14. for(int i=1;i<=q;i++) dp[i]=0;
  15. for(int i=0;i<=num;i++){
  16. for(int j=use[i];j<=q;j++){
  17. dp[j]=dp[j]|dp[j-use[i]];
  18. }
  19. }
  20. if(dp[q]==1)return1;
  21. return0;
  22. }
  23. void print(int num){
  24. printf("%d ",num);
  25. sort(use+0,use+num);
  26. for(int i=0;i<=num-1;i++){
  27. printf("%d ",use[i]);
  28. }
  29. }
  30. void dfs(int now,int top){
  31. if(now==top){
  32. if(judge(top-1)){
  33. print(top);
  34. exit(0);
  35. }
  36. return;
  37. }
  38. for(int i=1;i<=p;i++){
  39. if(b[i])continue;
  40. b[i]=1;
  41. use[now]=tong[i];
  42. dfs(now+1,top);
  43. b[i]=0;
  44. use[now]=0;
  45. }
  46. }
  47. int main(){
  48. memset(dp,0,sizeof(dp));
  49. memset(use,0,sizeof(use));
  50. memset(b,0,sizeof(b));
  51. scanf("%d%d",&q,&p);
  52. for(int i=1;i<=p;i++){
  53. cin>>tong[i];
  54. }
  55. sort(tong+1,tong+p+1);
  56. for(int top=1;top<=p;top++){
  57. memset(b,0,sizeof(b));
  58. dfs(0,top);
  59. }
  60. return0;
  61. }

【USACO 5.3.1】量取牛奶的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【洛谷2744 】【CJOJ1804】[USACO5.3]量取牛奶Milk Measuring

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

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

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

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

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

  9. luogu2744 量取牛奶

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

随机推荐

  1. 【Spring】 AOP Base

    1. AOP概述 2. AOP的术语: 3. AOP底层原理 4. Spring 中的AOP 4.1 概述 4.2 分类 4.3 Spring的传统AOP 针对所有方法的增强:(不带有切点的切面) 带 ...

  2. 机器学习——支持向量机(SVM)

    支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...

  3. Java获取两个日期之间的所有日期集合

    1.返回Date的list private List<Date> getBetweenDates(Date start, Date end) { List<Date> resu ...

  4. mybatis 生成代码配置 mybatis-generator:generate 的使用详解

    一.环境 mysql+eclipse 二.代码配置 pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  5. Netty源码分析 (八)----- write过程 源码分析

    上一篇文章主要讲了netty的read过程,本文主要分析一下write和writeAndFlush. 主要内容 本文分以下几个部分阐述一个java对象最后是如何转变成字节流,写到socket缓冲区中去 ...

  6. HBase WAL原理学习

    1.概述 客户端往RegionServer端提交数据的时候,会写WAL日志,只有当WAL日志写成功以后,客户端才会被告诉提交数据成功,如果写WAL失败会告知客户端提交失败,换句话说这其实是一个数据落地 ...

  7. 配置phpmyadmin连接远程 MySQL数据库

      引言:1.phpmyadmin程序所在服务器:192.168.1.1,访问地址为:http://192.168.1.1/phpmyadmin2.MySQL数据库所在服务器:192.168.1.2, ...

  8. Spring 7大模块的解说

    先看以下Spring的组成图: 7大模块包括:core.AOP.ORM.DAO.WEB.Context.WebMvc. 1:core:spring的容器,主要组成是BeanFactury.也是Spri ...

  9. 宝锋UV-5R说明书下载

    宝锋UV-5R说明书 百度网盘下载地址: 链接: https://pan.baidu.com/s/1QJXEJ2YyO7ovMAQG7Uur4A 提取码: j8d2 BI8EJM     73    ...

  10. log4j日志不输出的问题

    今天服务器上报错,想先去看一下日志进行排查,结果发现日志很久都没有输出过了.从上午排查到下午,刚刚解决,因此记录一下,但现在也只是知其然,并不知其所以然,所以如果大家有什么想法请在下方评论. 先说一下 ...