HDU 1203 I NEED A OFFER! (背包的多项式操作)
http://acm.hdu.edu.cn/showproblem.php?pid=1203
一个简单的0-1背包问题 特别之处就是算的是概率 是乘法的操作 所以把原来的加法用函数代替为相应的操作即可
#include<iostream> #include<stdio.h> #include<cstring> using namespace std; int m; double dp[10001]; double f(double x,double y) { return 1-(1-x)*(1-y); } void ZeroOnePack(int cost, double weight) { for (int i = m; i >= cost; i--) dp[i] = max(dp[i], f(dp[i-cost],weight)); } int main() { int n; while(cin>>m>>n) { memset(dp,0,sizeof(dp)); if(!m&&!n) break; for(int i=1;i<=n;i++) { int a; double b; cin>>a>>b; ZeroOnePack(a,b); } printf("%.1lf%%\n",dp[m]*100); } return 0; }