hdu 2955 小数背包

此题不能以被抓的概率作为花费,那样要面临着用小数做数组下标!!!于是,转移思维,用偷的钱作为花费.dp[i]表示偷i的钱被抓的最小概率,另外要

注意如何表示被抓的概率...

#include<iostream> #include<cstdio> #include<cmath> using namespace std; double dp[10010]; int a[101]; double w[101]; double p; int n; double min(double a,double b) { return a>b?b:a; } void solve(int sum,double w,int a) { for(int i=sum;i>=w;i--) dp[i]=min(dp[i],1.0-(1.0-dp[i-a])*(1.0-w)); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%lf%d",&p,&n); int i; int sum=0; for(i=0;i<n;i++) { scanf("%d%lf",&a[i],&w[i]); sum+=a[i]; } for(i=1;i<=sum;i++) dp[i]=2.0; dp[0]=0.0; for(i=0;i<n;i++) solve(sum,w[i],a[i]); i=sum; while(i>=0&&dp[i]>p) i--; printf("%d/n",i); } return 0; } 

你可能感兴趣的:(hdu 2955 小数背包)