存钱问题(枚举法)

/*
题目:存钱问题(枚举法)
内容:假设银行整存整取存款不同期限的月息利率为:
0.63%  期限为1年
0.66%  期限为2年
0.69%  期限为3年
0.75%  期限为5年
0.84%  期限为8年
现在已知某人手上有2000元,要求通过计算选择出一种存钱方案,使得这笔钱
存入银行20年后获得的利息最多,假定银行对超出存款的那部分时间不付利息。

作答者:小白杨

收获: 分析:假设在这20年中,1年期限的存了x1次,2年期限的存了x2次,3年
期限的存了x3次,5年期限的存了x5次,8年期限的存了x8次,则到期时存款人
所得的本利合计为:
2000*(1+0.063)∧x1 *(1+0.066)^x2 *(1+0.069)^x3 *(1+0.075)^x5 *(1+0.084)^x8;
由题意可知,显然8年期限的存款次数最多为两次,因此可得到下面对存款期限的限定条件:
0<=x8<=2
0<=x5<=(20-8*x8)/5
0<=x3<=(20-8*x8-5*x5)/3
0<=x2<=(20-8*x8-5*x5-3*x3)/2
0<=x1=(20-8*x8-5*x5-3*x3-2*x2)
*/ 

#include 
#include 

int main()
{
	double money = 0,result;
	int x1,x2,x3,x5,x8,y1,y2,y3,y5,y8;
	
	for(x8=0;x8<=2;x8++)
	{
		for(x5=0;x5<=(20-8*x8)/5;x5++)
		{
			for(x3=0;x3<=(20-8*x8-5*x5)/3;x3++)
			{
				for(x2=0;x2<=((20-8*x8-5*x5-3*x3)/2);x2++)
				{
					x1=(20-8*x8-5*x5-3*x3-2*x2);
					result = 2000*pow((1+0.0063),x1)
						*pow((1+0.0066),x2)
						*pow((1+0.0069),x3)
						*pow((1+0.0075),x5)
						*pow((1+0.0084),x8);
					if(result > money)
					{
						money = result;
						y1 = x1;
						y2 = x2;
						y3 = x3;
						y5 = x5;
						y8 = x8;
					}
				}
			}
		}
	}
	
	printf("y1 = %d\ty2 = %d\ty3 = %d\ty5 = %d\ty8 = %d\t%f\n",y1,y2,y3,y5,y8,money);
	return 0;
}

 

你可能感兴趣的:(C语言趣味编程)