HDU 2955
2012-01-17 21:12
148 查看
其实就是背包。
因为成功逃脱的概率是个double数,所以不可以用概率当做背包的V或者W了。
从m的小范围可以推测出来这时用m为下标比较合适。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn=110;
int m[maxn];
double p[maxn];
double f[10001];
int main()
{
freopen("in.txt","r",stdin);
int t;scanf("%d",&t);
while(t--)
{
double p0;
int n,sum=0;
scanf("%lf%d",&p0,&n);
p0=1-p0;
for(int i=1;i<=n;i++){scanf("%d%lf",&m[i],&p[i]);p[i]=1-p[i];sum+=m[i];}
for(int i=0;i<10001;i++)f[i]=0;
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=sum;j>=m[i];j--){
f[j]=max(f[j],f[j-m[i]]*p[i]);
}
}
int maxv=0;
for(int i=0;i<=sum;i++){
if(f[i]>p0)maxv=max(maxv,i);
}
printf("%d\n",maxv);
}
}
因为成功逃脱的概率是个double数,所以不可以用概率当做背包的V或者W了。
从m的小范围可以推测出来这时用m为下标比较合适。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn=110;
int m[maxn];
double p[maxn];
double f[10001];
int main()
{
freopen("in.txt","r",stdin);
int t;scanf("%d",&t);
while(t--)
{
double p0;
int n,sum=0;
scanf("%lf%d",&p0,&n);
p0=1-p0;
for(int i=1;i<=n;i++){scanf("%d%lf",&m[i],&p[i]);p[i]=1-p[i];sum+=m[i];}
for(int i=0;i<10001;i++)f[i]=0;
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=sum;j>=m[i];j--){
f[j]=max(f[j],f[j-m[i]]*p[i]);
}
}
int maxv=0;
for(int i=0;i<=sum;i++){
if(f[i]>p0)maxv=max(maxv,i);
}
printf("%d\n",maxv);
}
}
相关文章推荐
- 排位赛dp总结(HDU 2955,HDU 1864,HDU 1421)
- hdu 2955
- hdu 2955 Robberies (01背包好题)
- hdu 2955
- HDU 2955 Robberies 01背包
- HDU 2955 Robberies(01背包变型)
- HDU 2955 Robberies
- 01背包+卡精度 Hdu 2955
- hdu 2955 Robberies(01背包)
- hdu 2955
- hdu 2955 Robberies DP
- HDU 2955(01背包问题)
- HDU 2955 Robberies 【01背包】
- HDU 2955(0-1背包问题)
- 动态规划专题(01背包)HDU 2955-Robberies
- HDU 2955 Robberies(01背包)
- HDU 2955 Robberies(01背包+概率)
- HDU 2955
- HDU 2955 Robberies(01背包问题)
- hdu 2955 Robberies(0/1背包)