题目地址:HDU-1203
用dp[i]表示现状态的概率,那么转移方程即为....(看代码里吧 懒得打了)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
struct college {
int cost;
double possible;
} c[10000];
int n,m;
double dp[10005];
int main() {
while(cin>>n>>m) {
if(n==0&&m==0)break;
for(int i=0; i<m; i++)
cin>>c[i].cost>>c[i].possible;
memset(dp,0,sizeof(dp));
for(int j=0; j<m; j++)
for(int i=n; i>=0; i--) {
int r=i-c[j].cost; //前一个状态
if(r<0)break; // 没钱了
double t=(1-dp[r])*c[j].possible+dp[r]*(1-c[j].possible)+dp[r]*c[j].possible;
dp[i]=max(dp[i],t); // 取最大的
}
printf("%.1lf%%\n",dp[n]*100);
}
return 0;
}