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");
}
C程序设计的抽象思维-递归过程-砝码称重的更多相关文章
- 7行代码解决P1441砝码称重(附优化过程)
		
先贴上最终代码感受一下: #include <bits/stdc++.h> using namespace std; int i, N, M, wi[21], res = 0; int m ...
 - 安徽省2016“京胜杯”程序设计大赛_A_砝码称重
		
砝码称重 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 61 Accepted: 37 Description 小明非常喜 ...
 - NOI题库--砝码称重V2(多重背包2^n拆分)
		
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
 - P2347 砝码称重(动态规划递推,背包,洛谷)
		
题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...
 - Codevs No.2144 砝码称重2
		
2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...
 - P2347 砝码称重-DP方案数-bitset
		
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
 - 51nod 1449 砝码称重 (进制思想)
		
1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 现在有好多种砝码,他们的重量是 w0,w1,w ...
 - 51nod 1837 砝码称重【数学,规律】
		
题目链接:51nod 1837 砝码称重 小 Q 有 n 个砝码,它们的质量分别为 1 克. 2 克.……. n 克. 他给 i 克的砝码标上了编号 i (i = 1, 2, ..., n),但是编号 ...
 - P2347 砝码称重
		
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
 
随机推荐
- golang的sort研究
			
年前没钱,等发工资.就这么在公司耗着不敢回家,无聊看了下golang的sort源码 type Interface interface { // Len is the number of element ...
 - 【mongoDB】 分享系列
			
mongoDB 作为一个非关系性数据库(功能很像关系型数据库) MongoDB 之一 MongoDB是什么 MongoDB 之二 增-删-改-查 MongoDB 之三 数据类型 MongoDB 之四 ...
 - [mysql5.6]主从更换ip之后重新建立同步【转】
			
情况时这样的: 主从系统 centos6.5 mysql5.6 由于机房迁移ip地址变了,导致原来的主动无法同步,于是需要重新建立主从关系. 主 192.168.1.23 从 192.168.1.22 ...
 - Python的CGI编程实现-通过接口运行服务器py脚本
			
yum 安装apcche [apache]yum 安装Apache(Centos 6.9) https://www.cnblogs.com/lauren1003/p/5993654.html只需一行命 ...
 - Ubuntu+Nginx+uWSGI+Flask应用
			
Ubuntu 18.04,Nginx 1.14.0,uWSGI 2.0.17.1,Flask 1.0.2,Python 3.6.5, 多日未更新博客,就是在忙着把自己的Flask应用在Ubuntu上运 ...
 - js中的事件委托或是事件代理详解(转载)
			
起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...
 - public private protect
			
public 公有 使用public意味着声明public之后的成员对每个人都是可用的 private 私有 除非必须公开底层实现细目,否则就应该将所有的域指定为private protect 继 ...
 - MNMP下nginx1.6开启支持pathinfo配置,支持thinkphp的URL格式
			
对于thinkphp框架项目的访问格式有多种,其中pathinfo是默认的基本访问格式,格式为:http://hostname:port/index.php/模块名/action名/参数1/参数1的值 ...
 - 【LOJ】#2270. 「SDOI2017」天才黑客
			
题解 显然要记录每个点来的状态,这样会扩充出点度的平方条边,就gg了 删掉所有的点,把每个边拆成两个点,连一条边权为c 这个时候我们考虑对于原先的每个点,将所有与其相连边所需要的节点(不管是进入还是出 ...
 - spark优化之并行度
			
这个其实我前面已经记录过了,这里在记录一下. 我可以通过参数人为的来控制分区大小,增加分区中即可增加任务的并行度,并行度高自然运行的就快了嘛. 官方推荐集群中每个cpu并行的任务是2-3个(也就是2- ...