【USACO 5.3.1】量取牛奶
农夫约翰要量取 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
输出只有一行,由空格分开的整数组成:
为了量出想要的夸脱数,需要购买的最少的桶的数量,接着是:一个排好序的列表(从小到大),表示需要购买的每个桶的容积
#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 ;
}
- #include<iostream>
- #include<stdio.h>
- #include<stdlib.h>
- #include<algorithm>
- #include<cstring>
- usingnamespace std;
- int dp[20010];
- int tong[110];
- int use[110];
- bool b[110];
- int q,p,flag=0;
- bool judge(int num){
- dp[0]=1;
- for(int i=1;i<=q;i++) dp[i]=0;
- for(int i=0;i<=num;i++){
- for(int j=use[i];j<=q;j++){
- dp[j]=dp[j]|dp[j-use[i]];
- }
- }
- if(dp[q]==1)return1;
- return0;
- }
- void print(int num){
- printf("%d ",num);
- sort(use+0,use+num);
- for(int i=0;i<=num-1;i++){
- printf("%d ",use[i]);
- }
- }
- void dfs(int now,int top){
- if(now==top){
- if(judge(top-1)){
- print(top);
- exit(0);
- }
- return;
- }
- for(int i=1;i<=p;i++){
- if(b[i])continue;
- b[i]=1;
- use[now]=tong[i];
- dfs(now+1,top);
- b[i]=0;
- use[now]=0;
- }
- }
- int main(){
- memset(dp,0,sizeof(dp));
- memset(use,0,sizeof(use));
- memset(b,0,sizeof(b));
- scanf("%d%d",&q,&p);
- for(int i=1;i<=p;i++){
- cin>>tong[i];
- }
- sort(tong+1,tong+p+1);
- for(int top=1;top<=p;top++){
- memset(b,0,sizeof(b));
- dfs(0,top);
- }
- return0;
- }
【USACO 5.3.1】量取牛奶的更多相关文章
- [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)
题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...
- 洛谷 P2744 [USACO5.3]量取牛奶Milk Measuring
P2744 [USACO5.3]量取牛奶Milk Measuring 题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最 ...
- 【USACO 5.3.1】量取牛奶 迭代
Description 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就 ...
- [USACO5.3]量取牛奶Milk Measuring
https://daniu.luogu.org/problemnew/show/P2744 滚动数组压去第一维:前i种木桶 f[j] 量取体积j最少需要几种木桶 g[j] 体积j的最优解是否使用了第 ...
- luogu P2744 [USACO5.3]量取牛奶Milk Measuring
题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位——译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有 ...
- 【洛谷2744 】【CJOJ1804】[USACO5.3]量取牛奶Milk Measuring
题面 Description 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位--译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少 ...
- 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring
题目描述 农夫约翰要量取 Q(1 <= Q <= 20,000)夸脱(夸脱,quarts,容积单位--译者注) 他的最好的牛奶,并把它装入一个大瓶子中卖出.消费者要多少,他就给多少,从不有 ...
- [luoguP1494] 岳麓山上打水 && [luoguP2744] [USACO5.3]量取牛奶Milk Measuring
传送门 传送门 dfs选取集合,dp背包判断 虽然我觉的会TLE.. 但是的确是AC了 #include <cstdio> #include <cstring> #includ ...
- luogu2744 量取牛奶
题目大意 给出一个整数集合$A$,总数$N$,规定一个整数序列$\{a_n\}, \forall i, a_i\in A$满足条件:存在一个正整数序列$\{k_n\}$,使得$\sum_{i=1}^n ...
随机推荐
- docker容器内 java应用程序启动慢
原谅我对JVM 不是很熟悉. 参考http://hongjiang.info/tomcat-startup-slowly-in-docker/ 感谢作者.
- 011 实例2-Python蟒蛇绘制
目录 一."Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 二."Python蟒蛇绘制"实例编写 三.运行效果 3.1 程序关键 四." ...
- Winform中怎样根据Name获取同窗体的控件
场景 在同一个Winform窗体中,点击一个Button按钮时, 获取同窗体的其他控件的属性. 首先需要对要获取的控件赋予Name属性,然后就可以通过Name进行获取. 实现 在Button的点击事件 ...
- 浮动后的 <li> 如何在 <ul> 中居中显示?
百度了许久都没有满意的解决方案,现在终于搞定了. 其实,只要 ul 的父元素 css 样式设了 text-align: center; 然后 ul 设了 display: inline-block; ...
- 【学习笔记】python3核心技术与实践--如何逐步突破,成为python高手
众所周知,Facebook 的主流语言是 Hack(PHP 的进化版本).不过,我敢拍着胸脯说,就刚入职的工程师而言,100 个里至少有 95 个,以前都从未用过 Hack 或者 PHP.但是,这些人 ...
- 判断是手机端还是PC短访问
第一种:判断是手机访问还是PC访问 <script> function browserRedirect() { var sUserAgent = navigator.userAgent.t ...
- WebDriver 将浏览器窗口最大化
package com.entrym.main; import java.io.File; import java.io.IOException; import org.openqa.selenium ...
- python实例化时带括号与不带
1.首先这个标题题目不是很准确,但一时又想不到更好的标题所以只好用这个标题,下面我们来看看为什么. 首先我们要明白python中类的实例化是要加上括号的,那么不加括号是什么意思你,看代码 class ...
- .Net Core 3.0 gRPC部署问题解决
前言 .Net Core3.0终于如约而至的来了.在3.0中增加了许多东西.也有了许多的变化.今天我们看的就是在3.0中使用gRPC并遇到的问题.gRPC现在可以非常方便简洁的在.Net Core中使 ...
- 前台提交数据到node服务器(get方式)
.有两种办法,一种是表单提交,一种是ajax方式提交. 1.form提交 在前台模板文件上写: <form action="/reg" method="get&q ...