分汤
DP方程很容易得到,主要是一个注意点,就是在N很大的是,要求的值非常接近1。
所以无需再求。坑点。。。。
class Solution {
public:
int op[4][2] = {
{
100,0},{
75,25},{
50,50},{
25,75}};
double dp[1010][1010] = {
0};
double soupServings(int N) {
if(N>=1000*25) return 1;
return solve(N,N);
}
double solve(int a,int b){
double res = 0;
if( dp[a/25][b/25] ) return dp[a/25][b/25];
// 枚举 4 种方案
for(int k=0;k<4;k++){
if(a<=op[k][0] && b<=op[k][1]){
// 同时分配完
res += 0.125;
}else if(a<=op[k][0]){
// a分配完
res += 0.25;
}else if(a>op[k][0] && b>op[k][1]){
// 子问题
res += 0.25*solve(a-op[k][0],b-op[k][1]);
}
}
return dp[a/25][b/25] = res;
}
};