hdu 1203 01背包 I need a offer
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203
题目大意:给你每个学校得到offer的概率以及花费,给定money,求得到至少一份offer的最大概率。
简单的01背包
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 double f[10005],p[10005]; 7 int n,m; 8 int va[10005]; 9 10 void dp() 11 { 12 //memset(f,1,sizeof(f)); 13 for(int i=0;i<=n;i++) 14 f[i]=1.0; 15 for(int i=1;i<=m;i++) 16 for(int j=n;j>=va[i];j--) 17 { 18 if(f[j]>f[j-va[i]]*(1-p[i])) 19 f[j]=f[j-va[i]]*(1-p[i]); 20 //cout<<i<<' '<<j<<' '<<f[j]<<endl;; 21 } 22 } 23 24 int main() 25 { 26 while(~scanf("%d%d",&n,&m)&&(m+n)) 27 { 28 for(int i=1;i<=m;i++) 29 scanf("%d%lf",&va[i],&p[i]); 30 dp(); 31 printf("%.1lf%% ",(1-f[n])*100); 32 } 33 return 0; 34 }
attention:
虽然是个简单的01背包,但是也没有马上就写出来,败给memset()了。
memset()是以字节填充,一般可以填充 -1 ,0,inf(最大值),-inf。
可以用另外一个函数fill(a,a+n,value);
详细用法,问度娘。