C程序设计的抽象思维-递归过程-砝码称重

C程序设计的抽象思维-递归过程-砝码称重

大家好,又见面了,我是全栈君。

【问题】

在狄更斯时代,商人们用砝码和天平来称量商品的重量,假设你仅仅有几个砝码,就仅仅能精确地称出一定的重量。比如,假定仅仅有两个砝码:各自是1kg和3kg。

仅仅用1kg的砝码能够称出1kg重量的商品,仅仅用3kg的砝码能够称出3kg重量的商品。

1kg和3kg的砝码放在天平同一边能够称出4kg重量的商品,放在不同边能够称出2kg重量的商品。

因此利用这两个砝码。我们能够称出重量分别为1、2、3、4kg的商品。

编写一个递归函数:

bool IsMeasurable(int target, int weights[], int nWeights)

用来确定用一组给定的砝码是否能称量指定的重量。

可用的砝码用数组weights表示,nWeights表示砝码的个数。

比如前面所讲的两个砝码的演示样例能够使用例如以下的变量表示:

static int sampleWeights[] = {1, 3};

static int nSampleWeights = 2;

给定之后,调用函数:

IsMeasurable(2, sampleWeights, nSampleWeights)

将返回TRUE。由于1kg和3kg的两个砝码可以称出2kg重量的商品。

假设调用函数:
IsMeasurable(5, sampleWeights, nSampleWeights)

将返回FALSE, 由于不能用重1kg和3kg的砝码称5kg的商品。

【分析】

对这个问题最主要的考虑是能按下面方式中的不论什么一种使用每个砝码:

1. 能把它放在天平上与商品不同的一边

2. 能把它放在天平上与商品同样的一边

3. 能把它移离天平

假设选定砝码组中的一个砝码,并知道怎样使用这三个选项中之中的一个来处理后面的问题,那么就能提出解决问题所需的递归思想。

【代码】

#include <stdio.h>
#include <stdlib.h>

typedef enum{false, true}bool;

bool IsMeasurable(int target, int weights[], int nWeights)
{
	if(nWeights == 0)
	{
		if( 0 == target)
			return true;
		else
			return false;
	}else{
		bool a, b ,c;
		a = IsMeasurable(target, weights, nWeights -1);//将砝码移除
		b = IsMeasurable(target + weights[nWeights- 1], weights, nWeights - 1);//将砝码放在商品同一边
		c = IsMeasurable(target - weights[nWeights - 1], weights, nWeights - 1);//将砝码放在商品不同边
		return (a || b || c);
	}
}

int main()
{
	int sampleWeights[] = {1, 3, 5, 7, 10};
	int nSampleWeights = 5;
	bool result;
	result = IsMeasurable(50, sampleWeights, nSampleWeights);
	if(result)
		printf("TRUE\n");
	else
		printf("FALSE\n");
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115263.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android之如何使用Android的搜索框架

    当你需要在你的应用程序中提供搜索服务时,通过使用Android的搜索框架,应用程序将显示一个自定义搜索对话框来处理用户的搜索请求。通过一个简单的搜索按钮或从您的应用程序中调用API,搜索对话框就会显示在屏幕的顶部,并会自动显示应用程序图标。本文将教你如何为你的应用程序提供一个自定义搜索对话框。这样做,给您的用户提供一个标准化的搜索体验,并能增加如语音搜索和搜索建议等功能。基础知识A

    2022年3月10日
    113
  • oracle中integer最大值,integer表示的最大整数[通俗易懂]

    oracle中integer最大值,integer表示的最大整数[通俗易懂]Integer类型的变量可能存在的最大整数为?A.256BInteger类的数据范围为,最小值为-2^31,最大值为2^31-1;验证如下,创建java类TestInteger,做测试验证用,编写java代码,创建Integer对象,值为256,数据可以输出,Integeri=newInteger(256);System.out.println(i);java中int型最大值…

    2025年10月6日
    2
  • Weblogic的Admin server进程将CPU消耗尽问题解决

    Weblogic的Admin server进程将CPU消耗尽问题解决

    2022年1月30日
    51
  • Activiti工作流使用之流程结构介绍[通俗易懂]

    Activiti工作流使用之流程结构介绍[通俗易懂]Activiti工作流使用之流程结构介绍文章目录Activiti工作流使用之流程结构介绍一、工作流介绍1.1概述1.2常见工作流二、工作流术语2.1工作流引2.2BPM2.3BPMN2.4流对象三、Activiti结构3.1Activiti系统服务结构图3.2Activiti数据库结构四、流程步骤4.1部署Activiti4.2流程定义4.3流程定义部署4.4启动一个流程实例4.5用户查询代办任务(Task)4.6用户已办任务历史记录4.6用户已办任务历史记录一、工作流介绍

    2022年9月27日
    3
  • Android中如何根据图片url路径来获取网络图片

    Android中如何根据图片url路径来获取网络图片原文地址:Android中如何根据图片url路径来获取网络图片1、根据图片的URL路径来获取网络图片,核心代码如下:publicstaticBitmapgetBitmap(Stringpath)throwsIOException{URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url

    2022年9月22日
    3
  • linux tar (打包、压缩、解压)命令[通俗易懂]

    linux tar (打包、压缩、解压)命令[通俗易懂]打包程序:tarc:  创建文档 t:列出存档内容 x:提取存档 f:filename要操作的文档名 v:详细信息一:打包打包:是指把文件整合在一起,不压缩1.将文件打包:tarcfa.tar/etc/2.列出文档内容:tartfa.tar3.提取文档内容:tarxfa.tar二:压缩压缩:把打包好的文件压缩,便于存储…

    2022年5月31日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号