杭电1203
题意:某穷人有n万美元申请m个学校,给出申请每个学校费用及拿到offer的概率,求起码得到一个offer的最大概率。
Analyse:这是一个01背包问题。要求的是一个offer都拿不到的最小概率,f[i][j]=min{f[i-1][j],f[i-1][j-cost[i]]*fail_prob[i]}。
View Code
1 #include<cstdio> 2 typedef struct 3 { 4 int cost; 5 double prob; 6 }school; 7 double f[10010]; 8 school a[10010]; 9 int main() 10 { 11 int n,m; 12 int i,j; 13 double min; 14 while(scanf("%d%d",&n,&m) && (n || m)) 15 { 16 for(i=0;i<m;i++) 17 { 18 scanf("%d%lf",&a[i].cost,&a[i].prob); 19 a[i].prob=1-a[i].prob; 20 } 21 for(j=0;j<=n;j++) 22 f[j]=1; 23 for(i=0;i<m;i++) 24 { 25 for(j=n;j>=a[i].cost;j--) 26 if(f[j]>f[j-a[i].cost]*a[i].prob) 27 f[j]=f[j-a[i].cost]*a[i].prob; 28 } 29 printf("%.1lf%%\n",100-f[n]*100); 30 } 31 return 0; 32 }
还可以转换成对数log10(fail_prob[i])后计算对数的和的最小值。
View Code
1 #include<cstdio> 2 typedef struct 3 { 4 int cost; 5 double prob; 6 }school; 7 double f[10010]; 8 school a[10010]; 9 int main() 10 { 11 int n,m; 12 int i,j; 13 double min; 14 while(scanf("%d%d",&n,&m) && (n || m)) 15 { 16 for(i=0;i<m;i++) 17 { 18 scanf("%d%lf",&a[i].cost,&a[i].prob); 19 a[i].prob=1-a[i].prob; 20 } 21 for(j=0;j<=n;j++) 22 f[j]=1; 23 for(i=0;i<m;i++) 24 { 25 for(j=n;j>=a[i].cost;j--) 26 if(f[j]>f[j-a[i].cost]*a[i].prob) 27 f[j]=f[j-a[i].cost]*a[i].prob; 28 } 29 printf("%.1lf%%\n",100-f[n]*100); 30 } 31 return 0; 32 }


浙公网安备 33010602011771号