题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1203
解题思路:
首先想到的就是01背包,只是状态转移方程不一样而已。
dp[j]=max(dp[j],1-(1-dp[j-c[i]])*(1-p[i]));
dp[j]:容量为j的背包能得到offer的最大概率。
如果将第i个加进来的话,那么概率应该转成 1-(1-dp[j-c[i]])*(1-p[i]);
注意输出“%”,printf("%%");
源代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps=1e-8;
int n,m;
struct node
{
int c;
double p;
}s[10005];
double dp[10005];
int main()
{
freopen("in.txt","r",stdin);
int i,j,k;
while(scanf("%d%d",&n,&m)==2 && n+m)
{
for(i=0;i<m;i++)
scanf("%d%lf",&s[i].c,&s[i].p);
memset(dp,0,sizeof(dp));
for(i=0;i<m;i++)
{
for(j=n;j>=s[i].c;j--)
{
dp[j]=max(dp[j],1-(1-dp[j-s[i].c])*(1-s[i].p));
}
}
printf("%.1lf%%\n",dp[n]*100);
}
return 0;
}