杭电1203 DP 背包问题 (2010-12-23 20:42)

来源:互联网 发布:java循环结构 编辑:程序博客网 时间:2024/05/29 16:31

题目网址: 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;
}

原创粉丝点击