C语言编程多方案取最优,2011年计算机二级C语言编程辅导:最大化投资回报问题...

感谢大家对考试百科的支持,在本章《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("%d\n",money);

}

return 0;

}

以上就是百科的小编为大家提供的《2011年计算机二级C语言编程辅导:最大化投资回报问题》,该程序实现方法同样适合于背包问题,当然使用的时候也要针对具体情况,这样才能制定出最优的解决方案。

*******************************************************************

【友情推荐】:2011年计算机二级C语言编程辅导汇总

【友情推荐】:2011年计算机二级C语言编程:动态规划的背包算法

【友情推荐】:2011年计算机二级C语言编程:最长公共子串算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值