百钱百鸡问题(枚举练习)思路&C++/python解法

《算经》中经典问题 “ 今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何? ”

 (出自中国古代约5—6世纪成书的《张邱建算经》,是原书卷下第38题,也是全书的最后一题,该问题导致三元不定方程组,其重要之处在于开创“一问多答”的先例。——来自百度百科)

一道非常经典的算法问题

 

升级-  m钱n鸡问题;

拥有钱数为m、需要购买鸡数为n,试求出所有可能方案总数。

 

输入:
   每行对应一个测试样例,每一行包含两个数字,分别为n和m。最后一行包含2个-1,表示输入结束。


输出:

   输出所有可能购买方案总数

 

思路:
直接用枚举思想 : 有鸡翁记n1、鸡母记n2、鸡雏记n3 ,有 n1=0~n 、n2=0~n 、n3=0~n;
写到循环里(逐一列举) 即是
     for(n1=0; n1        for(n2=0; n2          for(n3=0; n3         }}}
逐一验证
                    if( n1+n2+n3 == n , 5n1+3n2+n3/3.0 == m )   ※一定要用3.0而不是3,这样可以保证计算的准确(int整型会砍小数)

 

算法实现:

#include 
using namespace std;

int main()
{
	int n=0,m=0,n1,n2,n3,icount=0;
//	cin>>n>>m;
	while((cin>>n>>m)&&(n!=-1)){
		icount = 0;
		for(n1=0; n1

---

优化:
枚举对象还可以缩减:鸡雏数量n3可以用 n-n1-n2 表示。
遍历空间的缩减: n1:0~m/5   ;n2:0~m/3 。

逐一列举变为:
    for(n1=0;n1       for(n2=0;n2

逐一验证
    5n1+3n2+(n-n1-n2)/3 ==m
 

代码实现:

#include 
using namespace std;

int main()
{
	int n=0,m=0,n1,n2,n3,icount=0;
	while((cin>>n>>m)&&(n!=-1)){
		icount = 0;
		for(n1=0;n1

优化后的算法时间复杂度为O(m^2)

 

 

补充: python的实现方法

n=int(input())
m=int(input())
q=0
for n1 in range(0,m//5,1):  #python3中//是取整除法、而/是真正意义的算术除法
	for n2 in range(0,m//3,1):
		if (n1*5+n2*3+((n-n1-n2)/3)==m): 
			print(n1,n2,n-n1-n2)
			q=q+1
print(q)

 

你可能感兴趣的:(ACM算法复习_(算法再学习),Python2&3相关笔记)