题目大意

  给出一个整数集合$A$,总数$N$,规定一个整数序列$\{a_n\}, \forall i, a_i\in A$满足条件:存在一个正整数序列$\{k_n\}$,使得$\sum_{i=1}^n a_i k_i = S$。求$n$最小值且字典序最小的$a_i$。

题解

错误解法

  令$f(j)$表示使得$\sum_{i=1}^m a_i k_i = j$的最小的$m$的值,令$i$为第几个$A$中的整数,则刷表递推式方式为UpdateMin$(f(j+A_i k),f(j)+1)$。这时我想,如果把$A$中的元素从小到大排序,只有能将以后的状态更新成最小时才更新答案,那么记录到的决策必然就是字典序最小的了。这样就错了,因为如果组成$j_1+K_1 A_{i_1}=j_2+K_2A_{i_2}=S$,$i_1 < i_2$,我们无法证明组成$j_1$的元素的字典序就比$j_2$的小。反例很难容易得出。

正确解法

  对每个$n$枚举$a_i$为$N$内的组合,然后用完全背包判断选择的组合是否满足条件即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int MAX_OBJ = 150, MAX_V = 21000;
int TotObj, TotV;
int Vs[MAX_OBJ];
vector<int> Ans; bool DP(int *_vs)
{
static bool f[MAX_V], vis[MAX_V];
memset(f, false, sizeof(f));
f[0] = true;
for (int i = 1; i <= TotObj; i++)
{
if (!_vs[i])
continue;
memset(vis, false, sizeof(vis));
for (int j = 0; j <= TotV; j++)
{
if (f[j] && !vis[j])
{
for (int k = 1; k <= (TotV - j) / _vs[i]; k++)
{
f[j + k * _vs[i]] = true;
}
}
}
}
return f[TotV];
} void JudgeAns(vector<int>& chosen)
{
static int _vs[MAX_OBJ];
memset(_vs, 0, sizeof(_vs));
for (unsigned int i = 0; i < chosen.size(); i++)
_vs[chosen[i]] = Vs[chosen[i]];
if (DP(_vs))
Ans = chosen;
} void Comb(vector<int>& chosen, int n, int m, int begin, void (*doSth)(vector<int>&))
{
if (n - begin + 1 < m - chosen.size())
return;
if (chosen.size() == m)
{
doSth(chosen);
return;
}
for (int i = begin; i <= n; i++)
{
if (Ans.size())
return;
chosen.push_back(i);
Comb(chosen, n, m, i + 1, doSth);
chosen.pop_back();
}
} int main()
{
scanf("%d%d", &TotV, &TotObj);
for (int i = 1; i <= TotObj; i++)
scanf("%d", Vs + i);
sort(Vs + 1, Vs + TotObj);
vector<int> chosen;
for (int i = 1; i <= TotObj; i++)
{
Comb(chosen, TotObj, i, 1, JudgeAns);
if (Ans.size())
break;
}
printf("%d ", (int)Ans.size());
for (unsigned int i = 0; i < Ans.size(); i++)
printf("%d ", Vs[Ans[i]]);
printf("\n");
return 0;
}

  

luogu2744 量取牛奶的更多相关文章

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

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

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

    题面 Description 农夫约翰要量取 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. 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring

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

  7. 【USACO 5.3.1】量取牛奶

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

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

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

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

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

随机推荐

  1. 梦想CAD控件关于曲线问题

    IMxDrawCurve 接口 控件中的曲线接口,实现了曲线的相关操作,如求曲线的长度,最近点,面积,曲线上任一点在曲线上的长度 切向方向,曲线交点,坐标变换,打断,偏移,离散等功能. 一.返回曲线组 ...

  2. java学习_5_21

    数组的插入.删除.扩容本质上都是用的数组的复制.Java中数组的拷贝如下: System.arraycopy(Object src, int srcPos, Object dest, int dest ...

  3. 04JavaScript程序语句

    JavaScript程序语句 2.6程序控制流程 2.6.1选择结构 if <逻辑表达式> 语句 else 语句 if <逻辑表达式> { 语句组 } else { 语句组} ...

  4. struts2源码下载链接

    http://blog.csdn.net/qq_qun_247286682/article/details/6975298

  5. 服务器的部署与Web项目的发布

    今天给老师的服务器部署项目,这次是第二次,基于第一次的经验,这次可以说是驾轻就熟. 服务器的系统是Windows Server 2008 R2 (64位) 需要安装的软件是:jdk7.TomCat7. ...

  6. 题解 洛谷P3203/BZOJ2002【[HNOI2010]弹飞绵羊】

    裸的LCT,关键是要怎么连边,怎么将这种弹飞关系转化成连边就行了. 那么我们可以这样连边: 一个节点i的爸爸就是i+ki. 没有i+ki那么就被弹飞了,即\(i\)的爸爸是虚拟节点n+1. 那么怎么求 ...

  7. POJ2454——Jersey Politics

    POJ2454——Jersey Politics 题目大意: 在泽西奶牛和荷斯坦奶牛的最新普查中,威斯康星奶牛在谷仓中获得了三个档位. 泽西奶牛目前控制着国家重新分配委员会. 他们想将国家分为三个相当 ...

  8. Gym - 101670F Shooting Gallery(CTU Open Contest 2017 区间dp)

    题目&题意:(有点难读...) 给出一个数字序列,找出一个区间,当删除这个区间中的两个相同的数字后,只保留这两个数字之间的序列,然后继续删除相同的数字,问最多可以实行多少次删除操作. 例如: ...

  9. 信息的表示和处理 及 CS:APP 15213 datalab

    信息的表示和处理 在通用计算机中中,字节作为最为最小 的可寻址的内存单元,而不是访问内存中单独的位. 寻址和字节顺序 big endian (大端法),数据最高字节部分地址在地址处,和人的感觉逻辑相似 ...

  10. https报错注销源文件内容

    open -a pycharm /Users/vivi/Library/Python/3.6/lib/python/site-packages/requests/packages/urllib3/co ...