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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • selinux 开启和关闭

    selinux 开启和关闭

    2022年2月9日
    67
  • DropDownList1.SelectedIndex及DropDownList1.SelectedValue的赋值[通俗易懂]

    DropDownList1.SelectedIndex及DropDownList1.SelectedValue的赋值[通俗易懂]困扰好长时间的一个问题,理解之后发现这么简单我定义了一个DropDownList绑定了一个数据表,里面没有静态数据,我想让它编辑的时候传值过来选定要编辑那项,上网找了好多方法,可怎么也不能实现,后来查了SelectedValue的定义。publicvirtualstringSelectedValue{     get     {           intnum1=this.SelectedIndex;           if(num1>=0)           {     

    2022年7月18日
    18
  • android完整项目源码_android完整项目源码

    android完整项目源码_android完整项目源码下载地址最后更新共计113个分类5177套源码29.2GB。卷新加卷的文件夹PATH列表卷序列号为000002005E7A:7F30F:.├─前台界面│├─3D标签云卡片热门││AndroidTagCloudView云标签的灵活运用.rar││Android实现标签拖动改变位置.rar││android流式布局和热门标签.zip││…

    2022年8月10日
    7
  • webpack版本区别_webpack和vue cli区别

    webpack版本区别_webpack和vue cli区别首先我们查看一下webpack的版本信息吧:现在已经更新到4.2.0版本了,理论上,我们可以选择任何一个版本,但是新的版本也不一定就是最好的选择,可能存在各种各样的问题,一旦出现了让人纠结的问题,解决麻烦还是挺浪费时间的,并且4.0以后的版本已经分离了webpack-cli,所以目前,无论是学习还是开发项目,我们可以先选择之前较为稳定的版本,个人还是用的3.0的版本;当然了,新的版本还是要测试着…

    2022年8月10日
    34
  • 设计模式之工厂模式建议收藏

    一普通工厂模式1.类图2.代码实现#pragmaonce#include<iostream>usingnamespacestd;//抽象渲染类classIR

    2021年12月19日
    47
  • matlab维纳滤波器函数_无源定位matlab源程序

    matlab维纳滤波器函数_无源定位matlab源程序维纳滤波器fir滤波器程序clear;clc;%输入信号A=1;%信号的幅值f=1000;%信号的频率fs=10^5;…

    2025年5月22日
    6

发表回复

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

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