鏈接: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(小錯釀大禍)。。。也是怪可惜的。。。