Description
Input
後面的m行,每行都有兩個數據ai(整型),bi(實型)分別表示第i個學校的申請費用和可能拿到offer的概率。
輸入的最後有兩個0。
Output
Sample Input
Sample Output
Hint
You should use printf("%%") to print a '%'.
題意:
給定n元錢的申請費,和n所學校,和在各個學校錄取的概率,要你求出至少錄取一所學校的最大概率。
思路:
典型的0-1揹包問題,題目要求的是至少收到一份Offer的最大概率,因爲至少一個錄取到右很多情況,我們可以逆向思維先求出一個學校也錄取不到的概率,然後用1-一個也錄取不到的概率就是所求的答案狀態轉移方程:dp[j]=min(dp[j],1-(1-dp[j-[i]]*(1-p[i])).
代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
int const maxn=10000+5;
int a[maxn];//第i個學校申請的費用
double b[maxn];//第i個學校申請到的概率的
double dp[maxn];//概率
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)&&(m+n))
{
for(int i=0; i<m; i++)
scanf("%d%lf",&a[i],&b[i]);
memset(dp,0,sizeof(dp));
for(int i=0; i<m; i++)
for(int j=n; j>=a[i]; j--)
dp[j]=max(dp[j],1-(1-dp[j-a[i]])*(1-b[i]));
printf("%.1lf%%\n",dp[n]*100);
}
return 0;
}