大意就不加阐述,问题中是要求至少一份offer的最大概率,我们可以转化为至多一份都没有offer的最小概率;故其状态转移方程为:
f[i][v]=min{f[i-1][v],f[i-1][v-money]*a};其中a为每份都没有被offer的概率。求出f[][]后,1-f[][]即为至少一份offer的最大概率了。是不是很简单,不过要好好思考
代码:
#include<iostream> using namespace std; int main() { double dp[10005]; int n,m,i,j; int w[10005]; double c[10005]; while(cin>>n>>m,m+n) { for(i=1;i<=m;i++) { cin>>w[i]>>c[i]; c[i]=1.0-c[i]; } for(i=0;i<=n;i++) dp[i]=1.0; for(i=1;i<=m;i++) { for(j=n;j>=w[i];j--) { if(dp[j]>dp[j-w[i]]*c[i]) dp[j]=dp[j-w[i]]*c[i]; } } printf("%.1lf%%\n",(1.0-dp[n])*100); } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。