HDU--2955
来源:互联网 发布:三星软件市场 编辑:程序博客网 时间:2024/05/16 05:20
找到状态转移方程即可。
#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#define max(a,b) a>b?a:busing namespace std;int main(){ int t,i,j,n,m[105]; double v[105],p,dp[105*105]; scanf("%d",&t); while(t--) { scanf("%lf%d",&p,&n); p=1-p; int sum=0; for(i=1;i<=n;i++) { scanf("%d%lf",&m[i],&v[i]); v[i]=1-v[i]; sum+=m[i]; } for(i=0;i<=sum;i++) dp[i]=0; dp[0]=1; for(j=1;j<=n;j++) { for(i=sum;i>=m[j];i--) { dp[i]=max(dp[i],dp[i-m[j]]*v[j]); } } for(i=sum;i>=0;i--) { if(dp[i]>p) { printf("%d\n",i); break; } } } return 0;}