主题:[讨论]如何得到最多存款
cmdblock
[专家分:570] 发布于 2011-04-20 19:11:00
假设银行不同期限的月息利率分别为:
0.63 期限=1年
0.66 期限=2年
0.69 期限=3年
0.75 期限=5年
0.84 期限=8年
利息=本金*月息利率*12*存款年限
现在某人手中有2000元现金,请通过计算选择一种方案,使得钱存入银行20年后得到的利息最多。
思考如下:
为了得到最多的利息,存入银行的钱到期应该全部取出来,然后将本金加利息在存进去。这样本利合起来滚动20年。
现在假设,1年存y1次,2年存y2次,3年存y3次,5年存y5次,8年存y8次。
y1+y2+y3+y5+y8=20
我觉得这个问题可以用DP(动态规划)来处理。不知道对不对?
如果可以用DP,那它的转移方程怎么写?我考虑了很久没有搞定。给程序参考也行。
回复列表 (共7个回复)
沙发
cmdblock [专家分:570] 发布于 2011-04-21 12:44:00
哪位大侠指点一二?
给个思路也行啊
板凳
sarrow [专家分:35660] 发布于 2011-04-21 15:29:00
#include <vector>
#include <iostream>
#include <cmath>
#include <iterator>
#include <algorithm>
#define SIZE_OF(a) ((sizeof a)/sizeof a[0])
std::vector<int> vi;
std::vector<int> vi_max;
/*
* 月利率% 期限(年)
* 0.63 1年
* 0.66 2年
* 0.69 3年
* 0.75 5年
* 0.84 8年
*/
int type[] = {1, 2, 3, 5, 8};
double rate[] = {0.63, 0.66, 0.69, 0.75, 0.84};
double rate_now = 0;
double rate_max = 0;
void init_rate()
{
for (int i = 0; i < SIZE_OF(rate); i++)
{
rate[i] = rate[i] * type[i] * 0.12 + 1;
}
}
int get_sum(const std::vector<int>& vi)
{
int ret = 0;
for( int i = 0 ; i < vi.size() ; ++i )
{
ret += type[vi[i]];
}
return ret;
}
double get_rate(const std::vector<int>& vi)
{
double ret = 1.0;
for( int i = 0 ; i < vi.size() ; ++i )
{
ret *= rate[vi[i]];
}
return ret;
};
void msg_out(const std::vector<int>& vi, double rate)
{
std::cout << "howto:" << std::endl;
for( int i = 0 ; i < vi.size() ; ++i )
{
std::cout << type[vi[i]] << ' ';
}
std::cout << "\nCurrent interest rate is " << rate << std::endl;
}
void step(std::vector<int> & vi)
{
if (get_sum(vi) == 20 )
{
rate_now = get_rate(vi);
msg_out(vi, rate_now);
if (rate_now > rate_max)
{
vi_max = vi;
rate_max = rate_now;
}
}
else
{
for (int i = 0; i < SIZE_OF(type); ++i)
{
if (vi.size() && i > *vi.rbegin())
break;
if (get_sum(vi) + type[i] <= 20)
{
vi.push_back(i);
step(vi);
vi.pop_back();
}
else
continue;
}
}
}
int main(int argc, char *argv[])
{
init_rate();
vi.reserve(20);
std::cout << "rate list below:" << std::endl;
std::copy(rate, rate + SIZE_OF(rate), std::ostream_iterator<double>(std::cout, "\n"));
step(vi);
std::cout << "------------------------" << std::endl;
msg_out(vi_max, rate_max);
}
3 楼
sarrow [专家分:35660] 发布于 2011-04-21 15:33:00
结论——我要去放高利贷!
4 楼
cmdblock [专家分:570] 发布于 2011-04-27 00:03:00
sarrow
你是用什么编辑器写程序的?
vi,emacs,还是vc?
5 楼
sarrow [专家分:35660] 发布于 2011-04-27 10:52:00
我用vim——这是我的最爱。现在手一摸键盘,习惯就是按按hjkl,然后脑袋里想着光标跟着移到哪里了。
Orz
6 楼
cmdblock [专家分:570] 发布于 2011-04-28 00:15:00
sarrow
你可以传一份你的vim配置到我的邮箱吗?谢谢
wow328@163.com
7 楼
wanghujun [专家分:10] 发布于 2011-05-05 20:49:00
[url=http://www.cmd59.com/code/vb/]vb[/url]
[url=http://www.cmd59.com/code/vc/]vc[/url]
[url=http://www.cmd59.com/plus/list.php?tid=16]delphi[/url]
[url=http://www.cmd59.com/code/vb.net/]vb.net[/url]
[url=http://www.cmd59.com/code/cc/]C#[/url]
[url=http://www.cmd59.com/code/java/]java[/url]
[url=http://www.cmd59.com/Python]python[/url]
[url=http://www.cmd59.com/vb/]vb源码[/url]
[url=http://www.cmd59.com/yy]易语言源码[/url]
[url=http://www.cmd59.com/c++]VC 源码[/url]
[url=http://www.cmd59.com/delphi]delphi 源码[/url]
[url=http://www.cmd59.com/]编程资源网[/url]
[url=http://www.cmd58.com/]vb[/url]
我来回复