CF632E Thief in a Shop 题解

news/2024/9/28 9:57:16 标签: C++, dp, 背包问题, 完全背包, 处理逻辑

CF632E Thief in a Shop 题解

  • 前驱
  • 题目
    • 链接
    • 字面描述
      • 题面翻译
      • 输入输出格式
        • 输入格式:
        • 输出格式:
      • 输入输出样例
        • 输入样例#1:
        • 输出样例#1:
        • 输入样例#2:
        • 输出样例#2:
        • 输入样例#3:
        • 输出样例#3:
  • 思路分析
    • 基本分析
    • 单一性反推多样性
    • 思想迸射
    • 思路一般化处理
  • 代码实现
  • 后继

前驱

省选-的题开始把我吓懵了

题目

链接

https://www.luogu.com.cn/problem/CF632E

字面描述

题面翻译

有一个小偷进入了一个商店。

像平常一样,他把他的幸运背包带在身上,他的背包里能放 k 个东西。商店里有 n 种产品,每种产品都有无限多个。对于每个第 i 种产品,它的价值是 a[i] 。

小偷很贪婪,所以他会准确地拿 k 个产品(他有可能把某一种产品拿很多个)。

你需要找出所有小偷可能偷走的物品价值之和。

输入输出格式

输入格式:

第一行有两个整数 n 和 k(1<=n,k<=1000)—— 物品的数量和小偷会拿的物品数量。
第二行有 n 个整数,每一个 a[i](1<=a[i]<=1000) 是从第 1 个到第 n 个物品的价值。

输出格式:

输出一行,所有可能的被偷窃的物品的价值,每两个之间用一个空格分隔。输出应该以一个递增序列输出。

输入输出样例

输入样例#1:

3 2
1 2 3

输出样例#1:

2 3 4 5 6

输入样例#2:

5 5
1 1 1 1 1

输出样例#2:

5

输入样例#3:

3 3
3 5 11

输出样例#3:

9 11 13 15 17 19 21 25 27 33
翻译贡献者UID:41262

思路分析

基本分析

本题,可读出来每个物品可取无限次 -> 很像完全背包

但是,题目限定恰好取 k k k件物品,十分的恶心(同时也是提升的一次机会。
不妨可以看出这道题中件数是代价,而且每件物品的件数均为1(有点小别扭),所以每件物品的代价均为 1 1 1

单一性反推多样性

之前做的背包题普遍是靠代价推转移方程算价值,但 d p dp dp只会取极值存储,就如函数的单一性每个 x x x对应唯一的 y y y ,反之拿 y y y x x x是本题不错的选择,因为函数中每个 y y y可以对应多个不同的 x x x。我之所以用函数来解释 d p dp dp,是因为 d p dp dp本身就是函数
所以一个代价只能对应一个极端价值,但是一个价值能对应多个代价,取代价最小,这个价值的发展空间才能最大化。

思想迸射

一个不成熟的思路油然而生;
状态定义:定义 f i f_i fi当凑得价值为 i i i时,最小所花费的次数

思路一般化处理

先不说 f i f_i fi怎么转移,至少我们可以确定这个 f f f数组是没有后效性的。

假设我们有了一个处理好的数组 f f f,针对 ∀ i ( 1 ≤ i ≤ 100 0 2 ) \forall i(1 \leq i \leq 1000^2) i(1i10002)
f i = k f_i=k fi=k
∴ f i , 绝对可取 \therefore f_i ,绝对可取 fi,绝对可取
f i > k f_i>k fi>k
∴ f i ,绝对不可取 \therefore f_i,绝对不可取 fi,绝对不可取
但针对 f i < k f_i <k fi<k
我们不清楚是否能取到,我们需要用一些特殊的处理方式来处理一下。

还来下面将说明这道题,不看 t j tj tj在一个月内都想不出来的处理方法

  • 加入价值为0的物品

因为这样在转移方程时,会忽略价值为 0 0 0的物品,加入它们不会让最小凑齐数最小。
∴ 为了让发展空间最大化,将 a 数组 s o r t ( 从小 − > 大 ) ,将 ∀ a i ( 1 ≤ i ≤ n ) − a 1 , 让原有 a 1 变为 0. 最后针对 f i < k 的情况将 i + k a 1 , 凑齐 k 件物品,将 i + k a 1 作为最终结果 \therefore 为了让发展空间最大化,将a数组sort(从小->大),将\forall a_i( 1 \leq i \leq n)-a_1,让原有a_1变为0.最后针对f_i<k的情况将i+ka_1,凑齐k件物品,将i+ka_1作为最终结果 为了让发展空间最大化,将a数组sort(从小>),将ai(1in)a1,让原有a1变为0.最后针对fi<k的情况将i+ka1,凑齐k件物品,将i+ka1作为最终结果

状态转移方程 f i = min ⁡ ( f i , min ⁡ ( f i − a j + 1 ) ) ) ( 1 ≤ i ≤ 100 0 2 ) ( 1 ≤ j ≤ n ) f_i=\min(f_i,\min(f_{i-a_j}+1)))(1 \leq i \leq 1000^2) (1 \leq j \leq n) fi=min(fi,min(fiaj+1)))(1i10002)(1jn)

时间复杂度: O ( 100 0 2 ⋅ n ) \Omicron(1000^2 \cdot n) O(10002n)
n 与 1000 同阶 n与1000同阶 n1000同阶
O ( n 3 ) ≈ 1 e 9 \Omicron(n^3) \approx 1e9 O(n3)1e9
5 s − > ≈ 1 e 9 5s -> \approx 1e9 5s>≈1e9
可以AC
分析结束!

代码实现

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e3+10;
const int inf=2e9;
int n,k,cnt;
int a[maxn],f[maxn*maxn],ans[2*maxn*maxn];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=1000000;i++)f[i]=inf;//状态初始化
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	sort(a+1,a+n+1);//sort lower->upper
	//计算凑齐价值为i的最小件数
	for(int j=1;j<=n;j++){
		for(int i=a[j]-a[1];i<=1000000;i++){
			if(f[i-(a[j]-a[1])]==inf)continue;
			f[i]=min(f[i],f[i-(a[j]-a[1])]+1);//价值为0物品处理
		}
	}
	//f[i]<=k 对于价值物品的补助
	for(int i=0;i<=1000000;i++){
		if(f[i]<=k)ans[++cnt]=i+k*a[1];
		else continue;
	}
	//sort print
	sort(ans+1,ans+cnt+1);
	for(int i=1;i<=cnt;i++)printf("%d ",ans[i]);
	return 0;
}

后继

数学是与信息紧密相同的, f r o m from from l o g i c a l logical logical t o to to l o g i c a l logical logical
必须加入好题本。

The End!


http://www.niftyadmin.cn/n/318107.html

相关文章

计算机网络-网络层与链路层协议分析实验

一.实验目的 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二.实验内容 1.完成路由器交换机的基本配置 2.了解 ICMP 数据包的格式 3.检查ARP交换 三.实验过程 1.完成路由…

React | React组件化开发(二)

✨ 个人主页&#xff1a;CoderHing &#x1f5a5;️ React .js专栏&#xff1a;React .js React组件化开发(二) &#x1f64b;‍♂️ 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f4ab; 系列专栏&#xff1a;吊打面试官系列 16天学会Vue 11天学会React …

Python综合案例—利用tkinter实现计算器的程序

目录 一、导入 tkinter 库 定义全局变量 二、定义回调函数 三、创建窗口对象 四、创建标签控件 五、创建数字按钮 六、创建加、减、乘、除和等于按钮 七、创建清空按钮 八、总结 用Python实现计算器可以让我们更好地理解面向对象编程、GUI 编程和事件驱动编程等概念&a…

Java EE 初阶---多线程(二)

目录 四、多线程案例之--单例模式 4.1 单例模式 4.2 怎么去设计一个单例&#xff1f; 饿汉模式 懒汉模式 4.3 两种模式的总结 四、多线程案例之--单例模式 4.1 单例模式 是校招中最常考的设计模式之一. 啥是设计模式&#xff1f; 设计模式好比象棋中的 " 棋谱 "…

网络数据链路层介绍

文章目录 一、以太网二、以太网的帧格式三、局域网通信的原理四、ARP协议1.ARP协议的介绍2.ARP协议的工作流程3.ARP数据报格式 一、以太网 以太网并不是一种具体的网络&#xff0c;而是一种技术标准&#xff0c;它既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内…

【Python--读写模式全解】

读写模式 读写模式语法读取写入追加 小结 读写模式 open() 函数常用形式是接收两个参数&#xff1a;文件名(file)和模式(mode)。 # 读写文件最好用 with...open...操作&#xff0c;这样最安全 # 而且还不需要关闭文件 with open(path,r)as f:f.read() # 一次读取整个文件&…

(GPT3)Language Models are Few-Shot Learners论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2005.14165v4.pdf 摘要 最近的工作表明&#xff0c;通过对大量文本语料库进行预训练&#xff0c;然后对特定任务进行微调&#xff0c;许多 NLP 任务和基准测试取得了实质性进展。 虽然在体系结构中通常与任务无关&#xff0c;但此方…

Bernhard‘s Talk on Towards Causal NLP 笔记

因果学习系列笔记 这是我的 GitHub 因果学习笔记仓库 https://github.com/xin007-kong/ryCausalLearning&#xff0c;欢迎 star&#x1f929; 讲者是 Bernhard Schlkopf talk 链接&#xff1a;(41) Bernhard Schoelkopf | Towards Causal NLP | KeynoteEMNLP 2021 Causal Infer…