问题标题: 酷町堂:1047 大佬快来帮忙啊 !!!

0
0
已解决
王子逸
王子逸
新手天翼
新手天翼

错误代码
 


#include<bits/stdc++.h>
using namespace std;
 
int n, c;
int a[10010], data[10010], v[10010];
int sum = 0;
int flag;
 
void print(int dep)
{
    for(int i = 1;i<=dep;i++)
    {
        if(i<dep) cout<<data[i]<<' ';
        else cout<<data[i]<<endl;
 
    }
}
 
void dfs(int dep)
{
    for(int i = 1;i<=n;i++)
    {
        if(!v[i]&&c>=a[i])
        {
            c -= a[i];
            data[dep] = a[i];
            v[i] = 1;
            if(c == 0)
            {
                if(flag == 0)
                {
                    print(dep);
                    flag = 1;
                }
                return;
            }
            else(dfs(dep+1));
 
            c += a[i];
            v[i] = 0;
 
        }
    }
}
 
int main()
{
    cin>>n>>c;
    for(int i = 1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if(sum<c)
    {
        cout<<"No Solution!"<<endl;
        return 0;
    }
    memset(data, 0, sizeof(data));
    memset(v, 0, sizeof(v));
    dfs(1);
    if(flag == 0)
    {
        cout<<"No solution!"<<endl;
    }
 
}

WA  70;

 

X_X

王子逸在2020-07-10 16:37:30追加了内容

                    已AC 给出思路 核心者采纳!

王子逸在2020-07-10 17:30:11追加了内容

另外  历代boss没有分的吗?

王子逸在2020-07-10 17:31:28追加了内容

就是5217

没经验值也就算了 

但没分是怎么回事

我都AC了啊

一百多行代码就这样没了?

王子逸在2020-07-10 17:33:24追加了内容


0
已采纳
包涵宇
包涵宇
中级天翼
中级天翼

你的代码我是没看懂,献上我的核心:

void dfs(int p,int t,int c){
    if(c>s||p>n)return ;
    if(s==c){
        for(int i=1;i<t;i++)cout<<b[i]<<" ";//输出
        exit(0);//实现在主程序外实现return 0的效果
    }
    if(c+sa[p]<s||c+ma[p]>s)return ;//剪枝,自己理解
//下面这三行代替了你的循环,简便
    b[t]=a[p];
    dfs(p+1,t+1,c+a[p]);//选
    dfs(p+1,t,c);//不选
}

ps:dfs这样调用:dfs(1,1,0);

你70分应该就是少了剪枝

注:

ma[x]的定义:从N到X最小的数

sa[x]的定义:从N到X的数之和

剪枝部分自己理解,其他自己补全

0
李瑞曦
李瑞曦
高级天翼
高级天翼

没有经验值

历代boss没有得分,模拟赛的题也没有哦~

李瑞曦在2020-07-10 17:57:43追加了内容

至于1047嘛,我的回答是:还没做呢。不要问我为什么,因为我还懒得做(其实是因为我还不会做~~哈哈哈)

0
王子健
王子健
初级天翼
初级天翼

我可不相信这个7分题是你自己写的

反正我是不信

我要回答