HDOJ2955 0/1背包的价值和重量
【hdoj2955】
1.概率问题;
计算逃跑率,但是要变成相×的
2.背包处理问题
然后因为率不能作为那个重量,所以价值作为重量,求一个在每个价值下的最大的逃跑率,然后在给定的逃跑率下面,来一个sum作为最大的那个价值,最后倒着for一波sum就行了
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string.h>
#include <math.h>
#include<stdlib.h>
#include <queue>
#include <set>*/
#include <algorithm>
using namespace std;
///dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j]);
double dp[10010];
double max(double a,double b)
{
return a>b?a:b;
}
int main()
{
int T,i,j,sum;
int w[110];
double v[110],k;
int n;
scanf("%d",&T);
while(T--)
{
scanf("%lf%d",&k,&n);
memset(dp,0,sizeof(dp));
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d%lf",&w[i],&v[i]);
sum+=w[i];
v[i]=1-v[i];
}
k=1-k;
dp[0]=1;
for(i=1;i<=n;i++)
{
for(j=sum;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]*v[i]);
}
}
for(i=sum;i>=0;i--)
{
if(dp[i]>=k)
break;
}
printf("%d\n",i);
}
return 0;
}