hdu 1203 I NEED A OFFER!

来源:互联网 发布:氰化钾淘宝叫什么名字 编辑:程序博客网 时间:2024/06/06 09:18

hdu  1203  I NEED A OFFER!           题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203

dp 01背包

题目分析:简单0-1背包。

code:

#include<stdio.h>#include<string.h>int m,n,pr[10010];double pe[10010],dp[10010];double min(double a,double b){return a<b?a:b;}int main(){int i,j;while(scanf("%d%d",&m,&n),m||n){for(i=0;i<n;i++){scanf("%d%lf",&pr[i],&pe[i]);pe[i]=1-pe[i];if(pr[i]>m)i--,n--;}for(i=0;i<=m;i++)dp[i]=1.0;for(i=0;i<n;i++)for(j=m;j>=pr[i];j--)dp[j]=min(dp[j],dp[j-pr[i]]*pe[i]);printf("%.1f%%\n",(1-dp[m])*100);}return 0;}

一开始用的搜索,居然一直wrong,不知为何……

code:

#include<stdio.h>int m,n,pr[10010];double pe[10010],dp[10010],ans;void dfs(int sum,double a,int k){if(ans>a)ans=a;if(sum==m)return;int i,j;for(i=k;i<n;i++){if(sum+pr[i]<=m)dfs(sum+pr[i],a*pe[i],i+1);else break;}}int main(){int i,j;while(scanf("%d%d",&m,&n),m||n){for(ans=1,i=0;i<n;i++){scanf("%d%lf",&pr[i],&pe[i]);pe[i]=1-pe[i];if(pr[i]>m)i--,n--;}dfs(0,1,0);ans=(1-ans)*100;printf("%.1f%%\n",ans);}return 0;}
改日再改……委屈






0 0