理财年代(暴力)

题目描述
最近通货膨胀很厉害,CPI跑得比银行利息要快,既要抗通胀又要避风险,其中一种很好的方式,就是购买银行发行的理财产品。虽然理财产品的利息比银行定期要高,而且没有风险,但是,购买理财产品需要一定的资金门槛,而且还要保证把钱存入一定时间不能取出来,因此也是有一定的限制的。
郭小姐很喜欢研究银行的理财产品,她计划在2011年拿10万元进行理财产品的投资,为了简单方便,她在2011年每次投资理财产品时,都是把这笔资金和之前购买理财产品产生的所有利息投入进去,希望在年底获取最高的利润。
【理财产品】
一个理财产品有如下要素:
资金门槛:至少要投入多少资金;
发行时间:该理财产品的购买时间;
投资天数:资金存放的天数;
年利息:该理财产品如果存放一年365天能获取的利息。
由于郭小姐选择的所有理财产品的门槛都是10万以内,因此理财产品就剩下后面的3个要素。  
例如,A1理财产品,发行时间是3月1日,投资天数为30天,年利息为 3.5%,那么,如果10万元购买该产品,那么在30天后,也就是3月30日收市后,她可以获得的资金为:
100000*(1+0.035*30/365)=100287.67元 (四舍五入,保留2位小数)
然后,她就可以吧100287.67元这笔资金,购买3月31日或之后发行的任何理财产品。
郭小姐在这一年内不断把本金和利息一起全额地购买理财产品,希望在2012年到来之前获得最高的收益。如果购买的两个理财产品之间有时间间隔,那么这笔钱就不能产生利润(银行活期利息太低,利润可以忽略)。请问她这年内,能通过购买理财产品,最多获取多少钱呢?

输入
第一行是整数N(1≦N≦15),代表理财产品的数目;
下面N行为3个由空格隔开的字符串 A B C;A代表发行时间,格式为MMDD(两位月两位日),例如4月1日则为0401,10月2日则为1002;B (整数),代表投资天数,范围是[10,300];C (最多2位的小数),代表百分之几的年利息,范围是[3,30];
输入数据保证:发行时间+投资天数不会超过2012年。

输出
只有一行,为年底最多可获得的连本带利的资金数目(四舍五入保留2位小数)。

样例输入
3
0101 100 4.5
0201 30 5
0402 50 7.8

样例输出
101483.84

提示
例子中的3个理财产品,只能购买1号产品,或者连续购买2号、3号理财产品。
购买1号理财产品的收益为 100000*(1+0.045*100/365)=101232.88
购买2/3号理财产品的收益为:
购买2号产品后总资金: 100000*(1+0.0530/365)=100410.96
再购买3号产品后总资金: 100410.96*(1+0.078
50/365)=101483.84
因此最高收益为 101483.84

思路
根据题意直接模拟,暴力寻解即可得解

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=25;
const int M=10005;
const int INF=0x3f3f3f;
const ull sed=31;
const ll mod=(1ll<<32);
const double eps=1e-8;
typedef pair<int,int>P;
typedef pair<double,double>Pd;

struct node
{
    int m,d,tim;
    double p;
}cp[N];
double ans;
int n;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool vis[N];

void dfs(double mo,int nm,int nd)
{
    ans=max(ans,mo);
    for(int i=0;i<n;i++)
    {
        if((!vis[i])&&((nm<cp[i].m) || (nm==cp[i].m && nd<=cp[i].d)))
        {
            double ret=mo*(1.0+cp[i].p*cp[i].tim*1.0/365);
            int tm=cp[i].m,td=cp[i].d+cp[i].tim;
            while(mon[tm]<td)
            {
                td-=mon[tm];
                tm++;
            }
            vis[i]=true;
            dfs(ret,tm,td);
            vis[i]=false;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%2d%2d%d%lf",&cp[i].m,&cp[i].d,&cp[i].tim,&cp[i].p);
        cp[i].p/=100.0;
    }
    dfs(100000.0,1,1);
    printf("%.2f\n",(int)((ans*100)+0.5)/100.0);
    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值