初级硬币问题

已知,有一批不同面值的硬币,没有硬币个数限制,求得到S的所有组合,以及最小,最大硬币个数。

最小、最大硬币个数可以用贪心法,但是不一定能够得到有效解,但是可以提高结题速度,此处略。

下面的解法比求解最大、最小硬币比较耗时。

static int* set;

static int  Min = 1<<10;
static  int Max = 0;

void LeastCoin(int* Value, int Len, int Goal, int cur)
{
	if(Goal == 0)
	{
		for(int i = 0; i < cur; i++)
		{
			printf("%d ", set[i]);
		}
		if(cur > Max)
		{
			Max = cur;
		}
		if(Min > cur)
		{
			Min = cur;
		}
		printf("\n");
	}
	else
	{
		for(int i = 0; i < Len; i++)
		{

			if(Goal >= Value[i])
			{
				int ok = 1;
				for(int j = 0; j < cur; j++)
				{
					if(set[j] > Value[i])
					{
						ok = 0;
						break;
					}
				}
				if(ok)
				{
				   set[cur] = Value[i];
				   LeastCoin(Value, Len, Goal - Value[i], cur + 1);
				}
			}		

		}

	}

}

void WLeastCoin(int* Value, int Len, int Goal)
{

	printf("goal: %d\n", Goal);
	set = new int [Len];
	memset(set, 0 , sizeof(int)*Len);
	int cur = 0;
	LeastCoin(Value, Len, Goal,  cur);
	printf("Max:%d \n", Max);
	printf("Min:%d \n", Min);

}

  

时间: 2024-08-02 11:02:31

初级硬币问题的相关文章

初级硬币最大最小问题递推法

static int* Min; static int* Max; void LeastCoin2(int* Value, int Len, int *d, int Goal) { for(int i = 1; i <= Goal; i++) { for(int j = 0; j < Len; j++) { if(i >= Value[j]) {   int distance = i - Value[j]; int temp1 = Min[distance] + 1; int temp2

初级模拟电路:3-1 BJT概述

回到目录 1.   名称由来 BJT的全称是双极性结型晶体管(Bipolar Junction Transistor),国内俗称三极管.其实,在英语中,三极管(triode)特指以前的真空电子管形式的三极管,而不是我们现在普遍使用的半导体三极管.“tri-”的意思是“三”,“ode”的意思是“极”,当年的电子管一般都封装在一个圆柱形的真空玻璃管中,所以中文翻译在后面加了个“管”. 早在二战以前,电子技术和电子元器件的应用就已经很发达了,在1930年代,全球电子管的年产量就已经达到1亿支以上.在那

【bzoj1042】 HAOI2008—硬币购物

http://www.lydsy.com/JudgeOnline/problem.php?id=1042 (题目链接) 题意:共有4种硬币,面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s的价值的东西.请问每次有多少种付款方法. Solution  容斥原理.  设F[i]为不考虑每种硬币的数量限制的情况下,得到面值i的方案数.则状态转移方程为 F[i]=Sum{F[i-C[k]] | i-C[k]>=0 且 k=1..4} ,边界条件F[0]=0. 

作为一名初级前端小白,写在年初的一些话

刚开始,还是吐槽一下这个标题吧···原本是打算写在年末的(也就是昨天),奈何大年夜的太忙(2.6才在回家的路上,第二天就大年三十了,基本没什么时间写这篇吐槽了,又熬不动夜),所以就拖到今天了. 其实最初,还是想讲一下从大学刚毕业(2015.06滚出校园),到2016年,新的一年,这一段时间的感受吧. [不忘初心] 好吧,不管是学校里的经历,还是毕业后找工作多么多么辛苦就不废话了(毕竟高中没好好学习,大学是普通的二本,然后大学后又是没好好学习,讲好听点就是拖延症,讲实话就是懒,没长记性),回顾那4

Shell脚本初级练习篇

Shell脚本初级练习篇 脚本1 作用:创建10个1M的文件 [[email protected] script]# cat make_file.sh  #!/bin/bash # for i in $(seq 1 10);do     dd if=/dev/zero of=/data/test/test"${i}" bs=1M count=1 done 脚本2 作用:移走/data/test目录下大于100K的普通文件到/tmp目录下 [[email protected] scrip

[HAOI2008]硬币购物

[HAOI2008]硬币购物 题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式: 每次的方法数 输入输出样例 输入样例#1: 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 输出样例#1: 4 27 说明 di,s<=100000 to

运维学习之selinux初级管理

selinux的初级管理 1.什么是selinux selinux,内核级加强型防火墙(内核上的一个插件) SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件.SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为

蓝桥杯 [翻硬币] 贪心

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29 题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态.一次操作的定义是让两个相邻的硬币反面.问从初始状态到目标状态所需要的最少操作次数是多少. 关键思想:贪心.要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的.那你想,既然是奇数次,那么最好的情况就是一次搞定啊.解决方案是有的,也很容易想--从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操

动态规划 硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的 最小值和最大值! 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出 解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢? 两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变 小,这样便于分析讨论. 2.这个规