牛客網 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(小錯釀大禍)。。。也是怪可惜的。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章