概述
感谢大家对考试百科的支持,在本章《2011年计算机二级C语言编程辅导:最大化投资回报问题》中,为各位备考计算机等级考试的同学准备了以下内容:
2011年计算机二级C语言编程辅导:最大化投资回报问题的实现
最大化投资回报问题:某人有一定的资金用来购买不同面额的债卷,不同面额债卷的年收益是不同的,求给定资金,年限以及债卷面额、收益的情况下怎样购买才能使此人获得最大投资回报。
程序输入约定:第一行第一列表示资金(1000的倍数)总量,第二列表示投资年限;第二行表示债卷面额总数;从第三行开始每行表示一种债卷,占用两列,前一列表示债卷面额,后一列表示其年收益,如下输入实例,
10000 1
2
4000 400
3000 250
程序实现如下,注释几乎说明了一切,所以不再另外分析。
/// 此数组是算法的关键存储结构,用来存储不同阶段各种债卷
/// 组合下对应可获取的最大利息。
int saifa[80005];
/// 此函数用于计算当前债卷在不同购买额下的最优利息情况,
/// 注意此时的利息情况是基于上一次债卷的情况下计算得到的,
/// 也就是说当前利息最优是基于上一次利息最优的基础上计算出来的,
/// 这也正好体现了动态规划中“最优化原则”:不管前面的策略如何,
/// 此后的决策必须是基于当前状态(由上一次决策产生)的最优决策。
void add(int a,int b)
{ cout << a
<< " "
<< b <<
endl; // for debug
for(int i=0;i<=80000;i++)
{
if(i+a > 80000)
{
break;
}
if(saifa+b > saifa[i+a]) // 累计同时购买多种债卷时的利息
{
saifa[i+a] = saifa + b;
}
if(i<200) // for debug
cout << i
<< "-"
<< saifa
<< " ";
}
cout << endl; // for debug
}
int main(void)
{
int n,d,money,year,pay,bond;
int ii,i;
scanf("%d",&n);
for(ii=0;ii
{
memset(saifa,0,sizeof(saifa));
scanf("%d%d",&money,&year);
scanf("%d",&d);
for(i=0;i
{
scanf("%d%d",&pay,&bond);
add(pay/1000,bond);
}
// 计算指定年限内最优组合的本金利息总额
for(i=0;i
{ cout << saifa[money/1000]
<< " "; // for debug
money += saifa[money/1000];
}
cout << endl; // for debug
printf("%dn",money);
}
return 0;
}
以上就是百科的小编为大家提供的《2011年计算机二级C语言编程辅导:最大化投资回报问题》,该程序实现方法同样适合于背包问题,当然使用的时候也要针对具体情况,这样才能制定出最优的解决方案。
*******************************************************************
【友情推荐】:2011年计算机二级C语言编程辅导汇总
【友情推荐】:2011年计算机二级C语言编程:动态规划的背包算法
【友情推荐】:2011年计算机二级C语言编程:最长公共子串算法
最后
以上就是隐形蜜蜂为你收集整理的C语言编程多方案取最优,2011年计算机二级C语言编程辅导:最大化投资回报问题...的全部内容,希望文章能够帮你解决C语言编程多方案取最优,2011年计算机二级C语言编程辅导:最大化投资回报问题...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复