牛客网 Wannafly挑战赛12-A 银行存款

链接:https://www.nowcoder.com/acm/contest/79/A

这天部门活动我没有参加这次比赛,在外面吃饭的时候收到了来自舍友和队友的求助,说题目数据坑。。回宿舍后遂一看究竟。

思路:

一、简单dp(第一反应)

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double money[30];
double r[4];
double _max(double a,double b){
	return a>b?a:b;
}
int main(){
	int n = 20;
	for(int i = 0;i < 4;i++)cin >> r[i];
	money[0] = 1;
	for(int i = 0;i <= n;i++){
		money[i+1] = _max(money[i+1],money[i]*(1+r[0]));
		money[i+2] = _max(money[i+2],money[i]*pow(1+r[1],2));
		money[i+3] = _max(money[i+3],money[i]*pow(1+r[2],3));
		money[i+5] = _max(money[i+5],money[i]*pow(1+r[3],5));
	}
	for(int i = 1;i <= 20;i++)
	cout << fixed << setprecision(5) << money[i] << endl;
	return 0;
}

由money[0]->money[n]更新数据,选最大即可。

二、另一种dp(队友思路)

#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    float a[5],b[5],x[25]={0};
    int c,i,j,v[5]={0,1,2,3,5};
    scanf("%d",&c);
    for(i=0;i<=c;i++)x[i]=1;
    scanf("%f%f%f%f",&a[1],&a[2],&a[3],&a[4]);
    b[1]=1+a[1];
    b[2]=pow(1+a[2],2);
    b[3]=pow(1+a[3],3);
    b[4]=pow(1+a[4],5);
    for(i=1;i<=4;i++)
    for(j=0;j<=c;j++)if(j>=v[i])
    x[j]=max(x[j],x[j-v[i]]*b[i]);
    printf("%.5f\n",x[c]);
    return 0;
}

这种思路来自背包dp的,代码因为一句“b[0] = 1+a[0]”没有加1而一直WA(小错酿大祸)。。。也是怪可惜的。。。

猜你喜欢

转载自blog.csdn.net/krypton12138/article/details/79674121
今日推荐