回 帖 发 新 帖 刷新版面

主题:[讨论]如何得到最多存款

假设银行不同期限的月息利率分别为:
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个回复)

沙发

哪位大侠指点一二?
给个思路也行啊

板凳

#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 楼

结论——我要去放高利贷!

4 楼

sarrow
你是用什么编辑器写程序的?
vi,emacs,还是vc?

5 楼

我用vim——这是我的最爱。现在手一摸键盘,习惯就是按按hjkl,然后脑袋里想着光标跟着移到哪里了。

Orz

6 楼

sarrow
你可以传一份你的vim配置到我的邮箱吗?谢谢
wow328@163.com

7 楼

[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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册