背包的典型思想,dp[i] i<=n 维持i时可以得到工作的最大概率,dp条件是:dp[j] = max(dp[j], 1-(1-dp[j-wei[i]])*(1-val[i]));
说来惭愧,概率论学的差,竟然没有想到这个条件,看来A题时还需要淡定的思考。贴代码以表决心,以后要好好A题了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int wei[10011];
double dp[10011], val[10011];
int main()
{
int m, n;
while(~scanf("%d%d", &n, &m) && (n+m))
{
for(int i=1; i<=m; ++i)
{
scanf("%d%lf", &wei[i], &val[i]);
}
for(int i=0; i<=n; ++i)
dp[i] = 0;
for(int i=1; i<=m; ++i)
{
for(int j=n; j>=wei[i]; --j)
{
dp[j] = max(dp[j], 1-(1-dp[j-wei[i]])*(1-val[i]));
}
}
dp[n] *= 100;
printf("%.1f%%\n", dp[n]);
}
return 0;
}