首页 > 其他分享 >「洛谷 P1658」购物

「洛谷 P1658」购物

时间:2023-01-04 20:00:44浏览次数:65  
标签:P1658 洛谷 硬币 int sum 凑出 购物 面值 任意

原题链接

你就要去购物了,现在你手上有 N 种不同面值的硬币,每种硬币有无限多个。为了方便购物,你希望带尽量少的硬币,但要能组合出 1 到 X 之间的任意值。

输出最少需要携带的硬币个数,如果无解输出 -1。

思路:

  1. 显然,当且仅当面值没有 1 时,ans 无解。
  2. 若存在面值为 1 的硬币,那么我们从小到大依次判断是否能组合出 1 到 X 之间的任意面值。
  • 设 sum 为当前可以凑出的最大面值,ans 为目前携带的硬币个数。(初始时,sum = 0,ans = 0)
  • 可以先找到小于等于 sum + 1 的最大面值为 a[i] 的硬币,那么则可以凑出 1 到 sum + a[i] 之间的任意面值,即每找到一个小于等于 sum + 1 的最大面值的硬币,则 ans++,并更新 sum 为 sum + a[i],直到 sum ≥ X。

证明:

  1. 首先,先证明为什么找到了小于等于 sum + 1 的最大面值为 a[i] 的硬币,就可以凑出 1 到 sum + a[i] 之间的任意面值。
  • 由于 sum 为当前可以凑出的最大面值,所以可以保证目前可以凑出 1 到 sum 之间的任意面值。此时,问题转化为是否可以凑出 sum + 1 到 sum + a[i] 之间的任意面值。
  • 由于加入了面值为 a[i] 的硬币,所以只需要再凑出 (sum + 1) - a[i] 到 (sum + a[i]) - a[i] 之间的任意面值即可。因为 a[i] ≤ sum + 1,所以保证了 (sum + 1) - a[i] ≥ 0。
  • 同时,(sum + 1) - a[i] 到 (sum + a[i]) - a[i] 小于等于 sum,这意味着可以组合出该区间内的任意面值,命题得证。
  1. 然后,再证明每次要找小于等于 sum + 1 的最大面值的硬币为最优解,即该方案可以保证携带的硬币个数最少。
  • 设 Ans 为正确答案(最少需要携带的硬币个数),cnt 为按照思路求解的结果,显然 Ans ≤ cnt。
  • 此时,只需证明 Ans ≥ cnt 即可。如果选取大于 sum + 1 的面值的硬币,则不能凑出 sum + 1 的面值,还需再添一枚硬币才行,此时所需的硬币个数不可能减少。如果选取的是小于等于 sum + 1 的面值的硬币,但不是最大面值,那么一定可以用最大面值来进行替换,所以 cnt 一定是最优解,即 Ans ≥ cnt。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int x, n;
int a[20];
int sum;
int ans;
int main()
{
	cin >> x >> n;
	
	bool f = false;
	for(int i = 0; i < n; i++)
	{
		cin >> a[i];
		if(a[i] == 1) f = true;
	}
	if(!f)
	{
		cout << "-1" << endl;
		return 0;
	}
	
	sort(a, a + n);
	
	while(sum < x)
	{
		int i;
		for(i = n - 1; i >= 0; i--)
		{
			if(a[i] <= sum + 1) break;
		}
		ans++;
		sum += a[i];
	}
	
	cout << ans << endl;
	return 0;
}

标签:P1658,洛谷,硬币,int,sum,凑出,购物,面值,任意
From: https://www.cnblogs.com/YuukiAsuna/p/17025744.html

相关文章

  • 洛谷P8567 真·基础数论问题
    基础数论重定向今天蒟蒻切水题切到一道建议评黄的红题,一下子给我整不会了……题目传送门理解题意首先,我们要理解题意。[JRKSJR6]Nothing我们定义\(f(x)\)表示\(......
  • 寒假第一次洛谷蓝桥个人赛 题解+补题(下)
    D.灵能传输##神仙结论把前缀和应用到极致,6先考虑三个数a,b,c,进行一次变换也就是a+b,-b,c+b可见三个数之和不变,也就是s[3]不变然后之前的s[1]+b,愿称之为s[2]之前的s......
  • 洛谷P8838 [传智杯 #3 决赛] 面试(害 刚开始,没想到用dfs 呜呜呜)
    这道题其实不算难,但是我没有想到用dfs,害,,难受。其次这个题,我看了大佬的代码,找到答案后直接exit(0),直接退出,而不是利用return一层层返回。其实这个题就是利用dfs求出每种......
  • jQuery 加入购物车 弹窗
    功能介绍:1.点击按钮,出现弹窗,和蒙版2.购物车数量显示1件商品3.点击右上角关闭按钮,关闭弹窗,蒙版消失4.点击继续购物按钮,弹窗消失,蒙版消失5.点击去购物车按钮,跳转页面6.点击蒙......
  • 洛谷2022年十二月月赛题解(作者:Kubic)
    T1只有第一秒走的长度为奇数,后面每一秒走的长度都为偶数,因此所有除\(0\)外的偶数点都是不可达的。当\(n\)为奇数时,设\(d\)为满足\(\sum\limits_{i=1}^d2^{i-1}\g......
  • 寒假第一次洛谷蓝桥个人赛 题解+补题(上)
    传送门部分,今天整不完了A.带分数(补题)##这...话说赛时难以置信地看了好几遍题目,然后完全没思路(我以为有什么神仙结论,压根没想暴力搜索,还是被虎到了,然后就根本没管这道......
  • 洛谷 P1223 排队接水
    题目传送门:https://www.luogu.com.cn/problem/P1223题目:Description:有nn个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n......
  • 洛谷P1862输油管道问题
    题目传送门二话不说先上代码:#include<bits/stdc++.h>usingnamespacestd;intn;intx,y[10001];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%......
  • 洛谷 P5721 【入门3】循环结构
    P5723【深基4.例13】质数口袋1.题目描述小A有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口......
  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P4146​​题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和​​AcWing2437.Splay​​这题一模一样。示例程......