题目网址: http://acm.hdu.edu.cn/showproblem.php?pid=1203
这道题一开始就把我难住了,我知道用DP做,但是怎么去解决剩下来的钱让我纠结不已,这是百度上某位大虾的源码,他把每一块钱
的概率从i=0做到i=m-1;最后offer[n]就是最大概率(n的钱最多).
#include<stdio.h>
#include<string.h>
double max(double a,double b)
{
if(a>b)
return a;
else
return b;
}
int main(void)
{
int n,m;
int i,j,k;
int ai[1010];
double bi[1010], offer[10010];
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(i=0;i<m;i++)
scanf("%d %lf",&ai[i],&bi[i]); //输入每个大学的费用与概论
memset(offer,0.0,sizeof(offer)); //初始化
for(i=0;i<m;i++)
{
for(j=n;j>=ai[i];j--)
offer[j]=max(offer[j],1-(1-offer[j-ai[i]])*(1-bi[i]));
// for(k=0;k<=n;k++)
// printf("%.3f ",offer[k]);
// printf("\n");
}
printf("%.1lf%%\n",offer[n]*100);
}
return 0;
}