回复 10楼 hsjjgm
e 先给你分析下问题;题目中五种存款方式我们切用 f1 f2 f3 f5 f8 表示,就拿你的样例输入来说,输入:20
接下来我们就要处理这个 20 了,是根据题目要求的“最佳方案”来处理
何谓最佳方案,20年,怎么存呢? 可以是存 20 次 f1,可以是 1次 f1,1次 f3,2次 f8; 还可以是 4 次 f5....
可见有多种方案,我们要做的就是在这多种方案中找出“最佳方案”
我的程序的主要思路:
1、就是那五个循环;作用是求方案的组合形式;
2、就是求本息和的 Getsum 函数;
注意:一种方案下,存款方式的顺序对结果无影响,
程序代码:
[color=#0000FF]#include<stdio.h> double Getsum(int[],int[],double[]);//定义一个函数Getsum,用来求某种存款方式的本息和; main() { int N,i,j,k,l,m,n,a[5],b[5]={1,2,3,5,8},d[5]; double sum,max=0,c[5]={0.0063,0.0066,0.0069,0.0075,0.0084}; printf("请输入存多少年:"); scanf("%d",&N); for(i=0;i<=N;i++) for(j=0;j<N;j++) for(k=0;k<=N;k++) for(l=0;l<=N;l++) for(m=0;m<=N;m++) { if(i+j*2+k*3+l*5+m*8==N) //这个以及上面面的五个循环是用来求 对于几种存款方式的组合形式,然后汇总与这个if语句来判断,比如说我存8年,可以使1 2 5,可以是3 5,或8个1.... { a[0]=i;a[1]=j;a[2]=k;a[3]=l;a[4]=m;//i~m分别是1 2 3 5 8五种存款方式的次数,分别把值赋给a[0]~a[4] sum=Getsum(a,b,c); //a,b,c三个数组 作参数带入函数Getsum,并由sum接收函数的返回值(也就是本息和) if(sum>max) //因为你输入一个存款年份,肯定有很多种方案,所以每产生一个sum就比较一次,留下最大的sum,也即是最佳方案 { max=sum; for(n=0;n<5;n++) //这个for语句是用来存储最佳方案下的五种存款方式的各自次数,可有可无 d[n]=a[n]; } } } printf("最佳方案:先存一年期%d次,再二年期%d次,三年期%d次,五年期%d次,最后八年期%d次\n最佳方案下的本息和:%.2lf\n",d[0],d[1],d[2],d[3],d[4],max); return 0; } double Getsum(int a[],int b[],double c[]) { int i,j; double sum1=2000; for(i=0;i<5;i++) //由此开始求本息和,这是外层循环,i有五个值,分别表示五种存款方式 for(j=1;j<=a[i];j++) //内层循环,a[i]表示这种存款方式的存款次数,所以从 f1 开始累积本息和 ,(存款方式的顺序对结果无影响) sum1+=sum1*c[i]*12*b[i]; //本息和公式 return sum1; //返回本息和 }
[/color]
[ 本帖最后由 韶志 于 2013-5-26 10:17 编辑 ]
三十年河东,三十年河西,莫欺少年穷!