又是一道背包题,这道比2602灵活一点。 #include <iostream> using namespace std; struct Bank { int money; double pro; }; double max(double a,double b) { double c =a>b?a:b; return c; } double p=0; double f[11000]; Bank bank[111]; int main() { int n,N,sum,m; scanf("%d",&n); while (n--) { sum=0; m=0; scanf("%lf%d",&p,&N); for (int i=0;i<N;i++) { scanf("%d%lf",&bank[i].money,&bank[i].pro); sum+=bank[i].money; } int t=sum; f[0]=1; for (i=1;i<=sum;i++) f[i]=-1; for (int k=0;k<N;k++) { for (t=sum;t>=bank[k].money;t--) { if (f[t-bank[k].money]!=-1) { f[t]=max(f[t],f[t-bank[k].money]*(1-bank[k].pro)); } if (f[t]>=1-p&&t>m)m=t; } } printf("%d/n",m); } return 0; }