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");
}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C++sstream

    C++sstream#include<iostream>#include<stdio.h>#include<algorithm>#include<vector>#include<cstring>#include<sstream>#include<strstream>#include<queue>using…

  • 如何测试网站打开速度(网站访问速度)

    检测网站打开速度的5个方法网页载入速度对于一个网站来讲很关键,Google已经将一个网站的载入速度列入了网站关键字排名的考虑因素当中,也就是说如果你的网站有足够的内容,而且载入速度比别人的网站更快一步的话,那么你就是获得更好的排名。那么下面就赶快测试你的网站,提高网站访问速度吧。1:用Ping命令简单测网站速度的方法Ping可以用来检查网络是否通畅或者网络连接速度,点击开始→运行在运行中输…

  • 回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路

    回溯法之n皇后问题总结_用回溯法求解n皇后问题的思路一、问题在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。二、算法与分析用数组x[i](1≤i≤n)表示n后问题的解。其中x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇后放在同一列,所以解向量中的x[i]…

  • L2-012关于堆的判断(堆)[通俗易懂]

    L2-012关于堆的判断(堆)[通俗易懂]堆题目链接将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:x is the root:x是根结点;x and y are siblings:x和y是兄弟结点;x is the parent of y:x是y的父结点;x is a child of y:x是y的一个子结点。输入格式:每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被

  • Android 中屏幕点击事件的实现

    Android 中屏幕点击事件的实现在android下,事件的发生是在监听器下进行,android系统能够响应按键事件和触摸屏事件,事件说明例如以下:onClick(Viewv)一个普通的点击button事件booleanonKey

  • Windows 进程 Tasklist查看 与 Taskkill结束

    Windows 进程 Tasklist查看 与 Taskkill结束目录Tasklist简述使用格式查看本机所有进程根据pid查询指定进程查看远程所有进程Taskkill简述根据进程PID结束根据进程图像名结束/f强制结束进程/t结束进程树Tasklist简述1、”Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。类似Linux系统的ps命令2、显示…

发表回复

您的电子邮箱地址不会被公开。

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