背包问题之01背包练习
这里给出崔添翼大牛的背包九讲--------------------崔添翼的个人网站
这里给出题目链接--------------A - Robberies 01背包(即hdu2955)
这里只要将代价改为相乘,最后遍历大于生存概率的价值最大者即为答案。
#include<bits/stdc++.h>
using namespace std;
const int Maxn=105;
int a[Maxn];
double b[Maxn],dp[Maxn*Maxn];
int main()
{
int T,i,j,n,sum;
float p,x;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
sum=0;
dp[0]=1.0; //100%生存
scanf("%f%d",&p,&n);
p=1.0-p; //至少要达到的生存概率
for(i = 1; i<=n; i++)
{
scanf("%d%f",&a[i],&x);
b[i]=1.0-x; //第i家银行的生存概率
sum+=a[i];
}
for(i = 1; i<=n; i++)
for(j = sum; j>=a[i]; j--)
dp[j]=max(dp[j],dp[j-a[i]]*b[i]); //j存的是总价值,dp[j]是在价值为j的时候生存概率
for(j = sum; j>=0; j--)
{
if(dp[j]>=p)
{
printf("%d\n",j);
break;
}
}
}
return 0;
}