农夫约翰要量取 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. innobackupex备份参数slave-info、safe-slave-backup

    mysql物理备份用的比较多的是innobackupex命令,备份常用,但对于里面的两个参数slave-info.safe-slave-backup一直搞的不太明白,今儿亲测了一下. 先解释一下参数意 ...

  2. yum rpm apt-get wget 辨析

    1)wget: 类似于迅雷,是一种下载工具,通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理名字是World Wide Web”与“get”的结合.类似于cur ...

  3. CSS——样式表的引入

    1.内部样式表 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  4. Recovery启动流程(2)---UI界面【转】

    Recovery启动流程系列文章把recvoery目录下文件分成小块讲解,最后再以一条主线贯穿所有的内容.这篇文章主要讲解Recovery-UI的相关内容. 我们知道,当我们通过按键或者应用进入rec ...

  5. 管中窥豹——框架下的SQL注入 Java篇

    管中窥豹--框架下的SQL注入 Java篇 背景 SQL注入漏洞应该算是很有年代感的漏洞了,但是现在依然活跃在各大漏洞榜单中,究其原因还是数据和代码的问题. SQL 语句在DBMS系统中作为表达式被解 ...

  6. Kilani and the Game-吉拉尼的游戏 CodeForce#1105d 模拟 搜索

    题目链接:Kilani and the Game 题目原文 Kilani is playing a game with his friends. This game can be represente ...

  7. 记一次java-selenium自动抢红包最简单案例1

    案例网址:http://xinyue.qq.com/act/pc/xyjf/a20170907envelopes/index.htm?ADTAG=AD_gw.home.pt.2_dyghb.20170 ...

  8. js校验对象是否全部为空

    function judgeIsNotBlank(obj) { var bool = true; var arr = Object.keys(obj); ; for(var key in obj){ ...

  9. 使用.NET Core中创建Windows服务(一) - 使用官方推荐方式

    原文:Creating Windows Services In .NET Core – Part 1 – The "Microsoft" Way 作者:Dotnet Core Tu ...

  10. Angular template ng-template/container/content

    1. ng-template 形式:<ng-template>...</ng-template> 默认ng-template中的内容会隐藏; 可通过[ngIf]来控制内容显示隐 ...