https://acm.hdu.edu.cn/showproblem.php?pid=1203
/*************************** 1. 01 背包 2. 求至少一个的概率p,则先求全部没有的q ,最后1-q 3. 要使p最大,则需q最小,(价值最小) 4. q 等于放入背包所有 物品的价值的 乘积 # 2013-11-23 12:29:07 # Time: MS Memory: K # Author: zyh ***************************/ #define N 10005 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> using namespace std; int c[N];//重量 double w[N]; //价值 double f[N]; //N件物品可以放的最大价值 bool mark[N]; //标记哪些物品放入背包 double zeroonepack(int V,int n) { int i,j; for(i=0;i<=V;i++) f[i]=1.0; for(i=0;i<n;i++) for(j=V;j>=c[i];j--) if(f[j]>f[j-c[i]]*w[i]) f[j] = f[j-c[i]]*w[i]; return 1-f[V]; } int main() { int t,n,i,m; while(~scanf("%d%d",&n,&m),m||n){ for(i=0;i<m;i++){ scanf("%d %lf",&c[i],&w[i]); w[i] = 1- w[i]; } printf("%.1lf%%\n",zeroonepack(n,m)*100); } return 0; }