HDU 4815 Little Tiger vs. Deep Monkey 背包问题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815

题意:很“内涵”的一个题面,题意是给出N道题,和一个概率P,然后给出每道题对应的得分aa[i](每道题只有两个选项,一个正确一个错误)。两个人来答题,一个人是随机选择答案,问另一个人至少要答多少分才能保证有P的概率不会失败。

思路:是一道DP题,最开始想强行枚举所有情况,找到需要分数,后来发现40道题强行枚举2^40必然超时,思路就中断了,后来想到DP,刚开始DP的可能得到的分数,但是很不靠谱,发现就是一个01背包问题啊,每道题可以选择放入背包或者不放入背包,对于每种得分记录对应的种类数。然后从小到大寻找可以满足条件,即情况总和对应概率大于P的得分。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include<string>
#define PI acos(-1.0)
#define maxn 10005
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
long long vis[40005];
long long dd[45];
int init()
{
    dd[1]=2;
    for(int i=2; i<=40; i++)
        dd[i]=dd[i-1]*2;
}
int main()
{
    int tot;
    int T;
    scanf("%d",&T);
    init();
    while(T--)
    {
        scanf("%d",&tot);
        double pos;
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        scanf("%lf",&pos);
        int aa[45];
        int bb=0;
        for(int i=0; i<tot; i++)
        {
            scanf("%d",&aa[i]);
            bb+=aa[i];
        }
        sort(aa,aa+tot);
        for(int i=0; i<tot; i++)
        {
            for(int j=bb; j>=aa[i]; j--)
            {
                vis[j]+=vis[j-aa[i]];
            }
        }
        long long cc=0;
        for(int k=0; k<=bb; k++)
        {
            cc+=vis[k];
            double ee=cc;
            double ff=dd[tot];
            double rec=ee/ff;
            if(rec>=pos)
            {
                printf("%d\n",k);
                break;
            }
        }
    }
    return 0;
}
时间: 2024-10-17 21:33:38

HDU 4815 Little Tiger vs. Deep Monkey 背包问题的相关文章

hdu 4815 Little Tiger vs. Deep Monkey(01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=4815 Description A crowd of little animals is visiting a mysterious laboratory ? The Deep Lab of SYSU. “Are you surprised by the STS (speech to speech) technology of Microsoft Research and the cat face recogn

HDU 4815 Little Tiger vs. Deep Monkey

http://acm.hdu.edu.cn/showproblem.php?pid=4815 题意: 给定N个题目各自的分数a[i] A有50%的概率答对一道题目得到相应分数,B想要在至少P的概率上总分不低于A 问B至少要得到多少分 解法: 概率DP dp[i][j]表示前i题得到j分的概率 递推式: dp[i][j] = dp[i-1][j] * 0.5 (a[i]>j) dp[i][j] = (dp[i-1][j] + dp[i-1][j - a[i]]) * 0.5 (a[i]<=j)

HDOJ 4815 Little Tiger vs. Deep Monkey

递推... Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 661    Accepted Submission(s): 244 Problem Description A crowd of little animals is visiting a mysterious labo

Little Tiger vs. Deep Monkey(01背包)

Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3715    Accepted Submission(s): 1276 Problem Description A crowd of little animals is visiting a mysterious laborator

HDU4815 Little Tiger vs. Deep Monkey——0-1背包

题目描述 对于n道题目,每道题目有一个分值,答对加分,答错不得分,你要和一个叫深猴的比赛,题目你可以假设成判断题(不是对就是错),深猴对于所有的题目都是随机选择一个答案,而你是有脑子的,求为了不输掉比赛(平局或你获胜)的可能性至少为p时你至少需要得到多少分,有t组数据,每次输入两行,第一行为n,p(有n道题目,n<=40, 不会输的可能性为p,0.0<=p<=1.0),第二行输入n个1~1000的整数,代表这n道题分别答对能获得的分数 样例输入 1 3 0.5 1 2 3 样例输出 3

HDU 4815 2013长春现场赛C题

C - Little Tiger vs. Deep Monkey Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4815 Description A crowd of little animals is visiting a mysterious laboratory ? The Deep Lab of SYSU. "Are y

[hdu contest 2019-07-29] Azshara&#39;s deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点. 首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里. 然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp. 区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连

HDU 4815 背包

标题的含义给出N问题.和概率P,然后给予相应的分数为每个问题x(每个问题只有两种选择,纠正错误). 两个人来回答.一个人是随机选择的答案,问:还有一个人的至少一些点的能力有保证P概率不会失败. 01背包,最大分数为40000,01背包处理,记录这40000个分数出现的次数 然后从小分数遍历一边就可以 #include "stdio.h" #include "string.h" #include "math.h" __int64 hash[4001

HDU ACM 1203 I NEED A OFFER!-&gt;背包问题

分析:最大录取概率=1-最小不录取概率. 0-1背包求出最小不录取概率,然后用1减去即可. 注意dp数组初始化时概率要先设置为1,表示一开始被录取. #include<iostream> using namespace std; double p[10001],dp[10001]; int v[10001]; int main() { int n,m,i,j; while(cin>>n>>m &&(n||m)) { for(i=0;i<m;i++)