zoukankan      html  css  js  c++  java
  • hdu4815----dp0-1背包

    /*
    题目大意:
    有n个问题,,告诉你答对该题能得多少分,其中一个人随机答题,问另一个人不输的概率为p
    至少需要答多多少分
    
    对于样例:
    3 0.5
    1 2 3
    分析:
    分数 0   1   2   3   3   4   5   6
    次数 1   1   1   2   1   1   1   1
    位置 1   2   3   4   5   6   7   8
    
    不输的概率为0.5 那么对应的位置为0.5*2^n=0.5*8=5
    因此对应的分数是3
    */
    
    
    #include <iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define LL long long
    #define MAX 40000+5
    int n,a[MAX];
    double p;
    int dp[MAX];//dp[i]代表分数i出现的次数
    
    int main()
    {
        freopen("in.txt","r",stdin);
        int T;
        cin>>T;
        while(T--)
        {
            scanf("%d%lf",&n,&p);
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            dp[0]=1;
            for(int i=1;i<=n;i++)
                for(int j=MAX;j>=a[i];j--)//从大到小,不然就重复更新了,因为是用小的更新大的
                    dp[j] += dp[j-a[i]];
            LL sum = 1LL<<n;//注意1LL否则爆int
            LL cnt = sum*p;
            if(sum*p-cnt)
                cnt+=1;
            LL num=0;
            for(int j=0;j<MAX;j++)
            {
                num+=dp[j];
                if(num>=cnt)
                {
                    printf("%d
    ",j);
                    break;
                }
            }
        }
        return 0;
    }
    
  • 相关阅读:
    小程序 视频
    b161: NOIP2007 4.Hanoi双塔问题
    命名规则、.gitignore、freopen()
    c++学习记录(九)
    c++学习笔记(八)
    2020面向对象程序设计寒假作业2
    c++学习记录(七)
    c++学习记录(六)
    c+学习记录(五)
    c++学习记录(四)
  • 原文地址:https://www.cnblogs.com/wt20/p/5855508.html
Copyright © 2011-2022 走看看