10 3 4 0.1 4 0.2 5 0.3 0 0
44.0% <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div> You should use printf("%%") to print a '%'. </div>
思路:攒下的钱n相当于包的容量,然后是m个学校的申请费用,申请费用相当于每一个物品的消耗,得到offer的概率相当于每一个物品的价值。
因为要求的是至少得到一份0ffer的概率的最大概率,可以转化成一份offer都得不到的最小概率
即状态转移方程 f[v]=min(f[v],f[v-w[i]*(1-c[i])),f[v]的值初始化为 1.0
思路:是一道背包问题,总钱数相当于背包的总容量,然后是不同学校需要的费用,要的是至少得到一份offer的概率,所以说可以取反,求一份都得不到的概率,这题再提交的时候总是在答案格式的方面出错,错了好几次,c语言的输出格式都忘了....
源码:
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
double min(double a,double b)
{
if(a<b)
return a;
else
return b;
}
int main()
{
double f[10010],c[10010];
int w[10010],n,m,i,v;
double t;
while((cin>>n>>m)&&n!=0&&m!=0)
{
for(i=1;i<=m;i++)
{
cin>>w[i]>>c[i];
}
for(i=0;i<=n;i++)
f[i]=1.0;
for(i=1;i<=m;i++)
{
for(v=n;v>=w[i];v--)
{
f[v]=min(f[v],f[v-w[i]]*(1-c[i]));
}
}
t=(1-f[n])*100;
printf("%.1lf",t);
printf("%%\n");
}
}