标题:一个竞赛题目,求指教
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:19 
一个竞赛题目,求指教
  某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
    每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
    每位选手都有一个起步的分数为10分。
    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
    你的任务是算出所有可能情况。每个答案占一行。


#include <iostream>
#include <cstring>
using namespace std;
int a[15],v[15];

void DFS(int Max,int i)
{
    if(Max==100)
    {
        for(int i=1;i<10;i++)
            cout<<v[i];
        cout<<endl;
        return;
    }
    if(i==10)
        return ;
    for(int j=1;j<=10;j++)
    {
        v[j]=1;
        DFS(Max+a[j],++i);    //做对
        v[j]=0;
        DFS(Max-a[j],++i);//做错
    }
   
}
int main()
{
    memset(a,0,sizeof(a));
    memset(v,0,sizeof(v));
    a[1]=1;
    for(int i=2;i<=10;i++)
        a[i]=2*a[i-1];
    DFS(0,0);
    return 0;
}
搜索更多相关主题的帖子: 分数 int Max for return 
2018-03-19 22:02
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
求指教、
2018-03-19 22:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:4 
https://bbs.bccn.net/thread-481334-1-1.html

好像和这个题目差不多~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-20 14:37
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:4 
#include<iostream>
#include<vector>
using namespace std;

vector<int> stack;
void dfs(int score , int questionNumber){
    if(questionNumber>10){   //超过10道一定会停,若满足条件输出
        if(score==100){
            for(int i=0;i<10;i++){
            cout<<stack[i];
        }
        cout<<endl;
        }
        return;
    }
    stack.push_back(1);    //答对压入1
    dfs(score*2 , questionNumber+1);
    stack.pop_back();    //遍历完所有情况后弹出该数1

    stack.push_back(0);   //打错压入0
    dfs(score-questionNumber , questionNumber+1);
    stack.pop_back();    //遍历完所有情况后弹出该数0
}

int main()
{
    dfs(10,1);    //当前分   题号
    return 0;
}

感觉这样要好理解点,你觉得呢
2018-03-20 19:53
a451410
Rank: 2
等 级:论坛游民
帖 子:34
专家分:48
注 册:2018-3-4
得分:4 
不懂
2018-03-20 20:34
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 4楼 word123
恩 能理解,我感觉我们两个的思路差不多啊,代码也差不多,我的代码哪里出现问题了呢?
2018-03-20 22:37
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 3楼 九转星河
学习了。。但是我还没想明白我的哪里出错了
2018-03-20 23:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 7楼 花脸
根据题意

DFS(Max-a[j],++i);//做错

这里应该是DFS(Max-j,++i);

相信4楼明白了答错扣掉与题号相同的分数这句话的是啥意思~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-03-20 23:11
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 8楼 九转星河

昨天看过之后已经改过了还是不对。。

[此贴子已经被作者于2018-3-21 12:41编辑过]

2018-03-21 12:36
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:0 
#include <iostream>
#include <cstring>
using namespace std;
int a[15],v[15];

void DFS(int Max,int i)
{
    if(Max==100)      //万一题还没答完怎么办(就算后面全错了也应该把分数减去)
    {
        for(int i=1;i<10;i++)   //和上面i冲突了,该成其他变量
            cout<<v[i];
        cout<<endl;
        return;
    }
    if(i==10)
        return ;
    for(int j=1;j<=10;j++)    //这个循环什么鬼?每次调用递归循环10次,不会死循环吗?
    {
        v[j]=1;
        DFS(Max+a[j],++i);    //做对  Max是当前分,当前分两倍
        v[j]=0;
        DFS(Max-a[j],++i);//做错     减去题号   a[j]是什么鬼?
    }
   
}
int main()
{
    memset(a,0,sizeof(a));
    memset(v,0,sizeof(v));   //v可以不赋值,读数据是在你把10道题都遍历完了才读的
    a[1]=1;
    for(int i=2;i<=10;i++)
        a[i]=2*a[i-1]; //a没用,是动态在变的,是当前分的两倍,而不是之前连续正确后得分的2倍
    DFS(0,0);    //初始分是10分,初始题号是1
    return 0;
}
反正你这道题问题太多了,没掌握清楚
2018-03-21 15:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485420-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.181228 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved