杭电2955-0-1背包

来源:互联网 发布:全国电视台直播软件 编辑:程序博客网 时间:2024/06/05 14:17

此题应该转化为安全率,然后再用0-1背包做,安全率第一次大于一定值的输出。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int M[110];double X[110];double dp[10100];int m,N;void ZeroOnepack(){for(int i=1;i<=N;i++){for(int j=m;j>=M[i];j--){dp[j]=max(dp[j],dp[j-M[i]]*(1-X[i]));}}}int main(){int T,i;double P;scanf("%d",&T);while(T--){scanf("%lf%d",&P,&N);m=0;for(i=1;i<=N;i++){scanf("%d%lf",&M[i],&X[i]);m+=M[i];}memset(dp,0,sizeof(dp));dp[0]=1;ZeroOnepack();for(i=m;i>=0;i--){if(dp[i]>(1-P)){cout<<i<<endl;break;} } }return 0;}


0 0
原创粉丝点击