解题思路:做完之后看了一下网上别人做的,发现还有些区别。反正直接构造一个10^4*10^4的double数组空间肯定超了,所以我用了轮换数组,但做完后发现只要用一维即可。还有个问题就是百分号的输出是%%,要打两个%!
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
double p[10005];
int c[10005];
double dp[2][10005];
void solve()
{
for(int i=0;i<10005;i++)
{
dp[0][i]=1;
dp[1][i]=1;
}
for(int i=m-1;i>=0;i--)
{
for(int j=0;j<=n;j++)
{
if(j<c[i])
{
dp[i&1][j]=dp[(i+1)&1][j];
}else
{
dp[i&1][j]=min(dp[(i+1)&1][j],dp[(i+1)&1][j-c[i]]*p[i]);
}
}
}
printf("%.1lf%%\n",(1-dp[0][n])*100);
}
int main()
{
freopen("t.txt","r",stdin);
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
for(int i=0;i<m;i++)
{
scanf("%d%lf",&c[i],&p[i]);
p[i]=1-p[i];
}
solve();
}
return 0;
}