DP的是没有被录取的概率,当这个概率最低的时候也就是录取率最高的时候。
#include"iostream"
#include"algorithm"
using namespace std;
const int maxn=10000+10;
const int maxm=10000+10;
double f[maxn];
int volume[maxn];
double N[maxn];
int main()
{
/*freopen("a.txt","r",stdin);*/
int v,n;
while(scanf("%d%d",&v,&n)!=EOF,(v||n))
{
for(int i=1;i<=n;i++)
{
scanf("%d%lf",&volume[i],&N[i]);
N[i]=1-N[i];
/*cout<<N[i]<<endl;*/
}
f[0]=1;
for(int i=1;i<=v;i++)
f[i]=1;
for(int i=1;i<=n;i++)
for(int j=v;j>=volume[i];j--)
{
f[j]=min(f[j],f[j-volume[i]]*N[i]);
/*cout<<f[j]<<endl;*/
}
printf("%.1f%%\n",100*(1-f[v]));
}
return 0;
}
<pre name="code" class="cpp">#include"iostream"
#include"stdio.h"
const int num=10005;
const int mum=10005;
using namespace std;
int main()
{
//freopen("a.txt","r",stdin);
int n,m; //钱,几所学校 体积,几个物品
int c[num]; //记录物品体积 (学校学费)
double w[num]; //记录物品价值(概率)
double f[mum]; //记录当前费用下最高的概率
while(cin>>n>>m&&(n||m)) //体积 物品数量 //m,n 两个不能同时为0
{
int i,j;
for(i=0;i<m;i++)
cin>>c[i]>>w[i]; //输入体积 价值
for(i=0;i<=n;i++)
f[i]=1;
for(i=0;i<m;i++)
{
for(j=n;j>=c[i];j--)
if(f[j-c[i]]*(1-w[i])<f[j])
f[j]=f[j-c[i]]*(1-w[i]);
}
printf("%.1f%%\n",(1-f[n])*100);
}
return 0;
}