捡硬币问题 动态规划算法C语言实现

2023-11-08

问题描述:

现有n个硬币按顺序依次排列在你面前,它们的面值可以看作一个数组coins[]={5,1,2,10,6,2},请在此中选取若干个硬币,使得所取硬币面值总和最大,捡取个数不限,但相邻的硬币不能捡取,请设计相应算法,要求能够输出累加值和选取的硬币序号(硬币面值为正数)

提示:建立数组dp[i]存储选取前i个硬币的累加值

#include<stdio.h>
#include<stdlib.h>
#define N 6
int j=0;
int selectcoins(int c[],int n,int s[])
{
	int i,dp[n];
	dp[0]=0;
	dp[1]=c[0];
	s[j]=1;//因为dp[1]=c[0],暂时选择了第一个硬币,所以暂时给s[0]赋值为1 
	for(i=2;i<=n;i++)
	{
		if(dp[i-2]+c[i-1]>dp[i-1])
		{
			dp[i]=dp[i-2]+c[i-1];
			if(s[j]==i-1) j--;//注意s[j]被赋值后值还可能会变,当满足这种情况时,s[j]会被再次赋值,即新的值覆盖原来的值 
			s[++j]=i;//记录选取硬币的序号 
		}	
		else
		{
			dp[i]=dp[i-1];//这种情况不需要记录新的硬币序号,因为此时dp[i]选取的硬币情况和dp[i-1]一样 
		}
	}
	return dp[--i];//i最后跳出循环时多加了一次1,故还要减一 
} 
int main()
{
	int coins[N]={5,1,2,10,6,2};
	int s[N/2+1]={0};//该数组用来存储选择的硬币序号,因为最多选择N/2+1项,所以数组大小为N/2+1 
	int max,i;
	max=selectcoins(coins,N,s);
	printf("max=%d\n",max);
	printf("选取的硬币编号为:");//硬币编号从1开始 
	for(i=0;i<=j;i++)//输出硬币编号,注意此处是i<=j,而不是i<N,表示后面未被赋值的s[j]不输出 
		printf("%d ",s[i]);
	return 0; 
}

运行结果 

 这只是针对一个具体的问题,读者可根据具体问题设置具体参数(代码是自己想的,还有很多可优化之处,后续作者会在空余时间优化代码,以适应更多问题场景,欢迎各位大佬提出宝贵建议。爱你们哦,嘿嘿)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捡硬币问题 动态规划算法C语言实现 的相关文章

随机推荐

  • maven集成单元测试插件

    1 maven不可允许忽略单元测试 2 引用jacoco version
  • 【Unity】 DoTween对UI进行DoFade操作存在问题及解决办法

    Unity DoTween对UI进行DoFade操作存在问题 Unity版本 5 2 5 4 当使用this GetComponent
  • 很好用的etcd可视化管理工具 etcdv3-browser

    etcd是一个高可用 强一致性的服务发现存储仓库的 是k8s里的一个基础组件 现在随着k8s的不断的被企业所使用 etcd也越来越被看好作为服务发现的好的组件之一 今天推荐的是一款用来对etcd进行管理的图形化管理工具 etcdv3 bro
  • (04)VTK移动模型,判断是否相交

    前言 在模型相交检测时 碰撞检测 使用了重写vtkInteractorStyleTrackballActor函数的自己构建的交互器 实现检测鼠标按键 并显示不同颜色在不同相交情况时 方法 重写 vtkInteractorStyleTrack
  • fastboot通用线刷工具_[教程] 小米手机解BL锁、线刷详细教程,适用于小米全系列手机...

    这几天看到论坛里很多人在问怎么线刷 下面我就做个详细的线教程大家看一下高手别喷我哈 此教程只适合刷官方MIUI包 进入正题 第一步 解BL锁 1 浏览器打开http www miui com unlock done html点击立即解锁 然
  • QT多线程

    本文档是自己所整理的一份文档 部分是原创 还转贴了网上的一此资料 已经标明了 难点是多线程的编写 是有源代码的 大家可以作为参考 用到的知识是视频采集 压缩解压 xvid 实时传输 jrtp 基于qt库所写的 由于本人对qt下的多线程还不很
  • Ubuntu20.04安装RabbitMQ,并配置远程调用,详细教程

    一 简介 RabbitMQ是一种在Erlang OTP中实现的开源消息队列软件 它实现了AMQP 高级消息队列协议 并使用插件与流行的消息传递解决方案进行通信 如MQTT 消息队列遥测传输 面向文本流的消息传递协议等 在本文中 您将了解如何
  • Linux中Shell脚本命令替换和grep接收变量作为参数

    需求 再服务器上启动Springboot项目上 使用Shell脚本作为启动脚本去执行 然后调用jar包 在本项目 需要从配置文件application properties中去获取端口号 然后根据端口号去获取进程的PID 问题 第一 如果获
  • 机器学习面试150题:不只是考SVM xgboost 特征工程(101-153)附送【名企AI面试100题】

    101 你意识到你的模型受到低偏差和高方差问题的困扰 应该使用哪种算法来解决问题呢 为什么 低偏差意味着模型的预测值接近实际值 换句话说 该模型有足够的灵活性 以模仿训练数据的分布 貌似很好 但是别忘了 一个灵活的模型没有泛化能力 这意味着
  • 服务器防御DDoS的方法,一文解决DDoS攻击

    近来 DDoS攻击越来越严重 香奈儿韩国分公司在黑客入侵其数据库后发表了道歉声明 表示公司已封锁黑客攻击背后的IP地址 并聘请一家网络安全公司调查此事 广大的网站用户应该采取怎样的措施进行有效的防御呢 下面超级科技就介绍一下防御DDoS攻击
  • 2023前端面试题(第一版持续更新)

    CSS display none 和visibility hidden 的区别是什么 display none 隐藏对应的元素 在文档布局中不再给它分配空间 它各边的元素会合拢 就当他从来不存在 visibility hidden 隐藏对应
  • Unity SpriteAtlas(图集)自动生成工具

    Unity SpriteAtlas 图集 自动生成工具 什么是图集 图集是一种将多个纹理合并为一个组合纹理的资源 可以调用此单个纹理来发出单个绘制调用而不是发出多个绘制调用 能够以较小的性能开销一次性访问压缩的纹理 为什么要打图集 减少Dr
  • Activiti工作流使用

    Activiti工作流 熟悉能用即可 https github com Activiti Activiti
  • java 企业工程管理系统软件源码 自主研发 工程行业适用

    工程项目管理软件 工程项目管理系统 对建设工程项目管理组织建设 项目策划决策 规划设计 施工建设到竣工交付 总结评估 运维运营 全过程 全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一 系统管理 1 数据字典 实现对数据字典标签
  • Ubuntu PCL安装过程之中遇见到问题

    详细的PCL安装过程在之前的文章之中有过记录 但是我一直忽略了一个问题 导致安装过程之中一直出现问题 在编译PCL 源码的过程如下 cd pcl mkdir build cd build cmake D CMAKE BUILD TYPE N
  • 【C++学习笔记(二十一)】之基类,子类的类型转换

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 普通基类 子类的转换 子类是由继承于基类 通常子类的内容要比基类多一些 因此子类开辟的内存要比基类大一些 一 基类 gt 子类 向下类型转换 当我们要把基类强转为子类时 由于子类
  • 帕斯卡三角形

    题目链接 int generate int numRows int returnSize int returnColumnSizes int ans malloc sizeof int numRows 开辟一块内存空间 用来返回ans 大小
  • ShapeDTW代码运行问题记录与解决方法

    下载shapeDTW的GitHub代码运行 测试 源码是MATLAB写的 需要保证电脑安装MATLAB 然后根据readme txt文件提示 第一步下载UCR数据集 http www cs ucr edu eamonn time serie
  • 实现哈夫曼树和哈夫曼编码

    原谅小编做了只鸽子 鸽了这么久 哈夫曼树在日常生活中可以用于文件的压缩 所以是我们程序员必不可少的基本功 下面跟着小编我一起来实现哈夫曼树和编码吧 一 哈夫曼树的实现 一 实现原理 哈夫曼树是一种特殊的二叉树 我们先假设有一个森林 里面是一
  • 捡硬币问题 动态规划算法C语言实现

    问题描述 现有n个硬币按顺序依次排列在你面前 它们的面值可以看作一个数组coins 5 1 2 10 6 2 请在此中选取若干个硬币 使得所取硬币面值总和最大 捡取个数不限 但相邻的硬币不能捡取 请设计相应算法 要求能够输出累加值和选取的硬