| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1793 人关注过本帖, 1 人收藏
标题:ACM 一道题目 求大神给个思路或者代码
只看楼主 加入收藏
qq873950124
Rank: 2
等 级:论坛游民
帖 子:5
专家分:34
注 册:2016-12-10
结帖率:50%
收藏(1)
已结贴  问题点数:10 回复次数:14 
ACM 一道题目 求大神给个思路或者代码
给出一个数字a,如 60,依次 再给出b个数字, 20 30 10 50 60,输出所有能组成数字a
的组合
如输入60
    5
        20 30 10 50 60
        则输出 20 30
        10 50
        60
        
        求大神给个思路 或者代码 谢谢
2016-12-11 22:32
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:2 
没懂你想要什么结果。。。输入两个数字,输出什么(输出的是什么)?

碧蓝航线真好玩
2016-12-12 13:37
0432liwen
Rank: 1
等 级:新手上路
帖 子:1
专家分:2
注 册:2006-10-1
收藏
得分:2 
这种我们叫turp数,你用循环嵌套去历遍所有组合就行了,符合结果就输出。代码就不写了,因为我c语言也是菜鸟。
2016-12-12 17:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:2 
有没有大神能帮忙实现一下这题?虽然我有点思路~但一时半会还是弄不出来~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 19:09
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:2 
每次只能用一个或两个数字还是可以1~b个数字?例子里面20和30又是怎么得出60的?
2016-12-14 21:28
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:2 
“所有能组成数字a的组合”是什么意思?
数字通常有 1 2 3 4 5 6 7 8 9 0

2016-12-14 21:51
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
不知道楼主说的组合方式是什么。如果是用加法的话。这个代码可行
#include<stdio.h>
int*arr,sum=0,target,length;
struct list
{
    int n;
    struct list*next;
};
struct list*head;
void AppendNode(struct list*h,int data)
{
    struct list*p=h;struct list*p_new=NULL;
    while(p->next!=NULL)
        p=p->next;
    p_new=(struct list*)malloc(sizeof(struct list));
    p_new->n=data;p_new->next=NULL;
    p->next=p_new;
}
void EraseTail(struct list*h)
{
    struct list*p1=h,*p2;
    p2=p1->next;
    if(p2==NULL) return;
    while(p2->next!=NULL)//当循环结束时,p2应该为尾结点
    {
        p1=p2;
        p2=p2->next;
    }
    free(p2);p1->next=NULL;
}
void PrintList(struct list*h)
{
    struct list*p=h->next;
    while(p!=NULL)
    {
        printf("%d,",p->n);p=p->next;
    }
}
void Detach(int start,int end)
{
    int i;
    for(i=start;i<=end;i++)
    {
        AppendNode(head,arr[i]);
        sum+=arr[i];
        if(sum==target)
        {
            PrintList(head);printf("\n");
            EraseTail(head);
            sum-=arr[i];
        }
        else
            if(sum>target)
            {
                EraseTail(head);
                sum-=arr[i];
            }
            else
            {
                if(i!=end)
                {
                    Detach(i+1,end);
                    EraseTail(head);
                }
                else EraseTail(head);
                sum-=arr[i];
            }
    }
}
int main()
{
    int i;
    head=(struct list*)malloc(sizeof(struct list));
    head->n=0;head->next=NULL;
    printf("请输入要得到的数字:");
    scanf("%d",&target);
    printf("请输入可使用数字的个数:");
    scanf("%d",&length);
    arr=(int*)malloc(length*sizeof(int));
    for(i=0;i<length;i++)
    {
        printf("请输入第%d个数:",i+1);
        scanf("%d",&arr[i]);
    }
    Detach(0,length-1);
    PrintList(head);
    return 0;
}
2016-12-14 22:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 yangfrancis
高人果然要用结构体啊~我以前做了一个类似的也是用到结构体的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 22:55
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 7楼 yangfrancis
看了这个,令我想起来查发票的人。
就是我收到好几张发票之后汇总金额一次汇款给对方。
由于业务往来多,有时对方收到款后也搞不清是哪几张发票的金额。
这就出现来查发票的人。
2016-12-15 06:33
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:2 
程序代码:
#include <stdio.h>

void display(int ans[], int len)
{
    for (int i = 0; i < len; ++i)
    {
        printf("%d%c", ans[i], "\n "[i + 1 < len]);
    }
}

/*

 * @param ssa 待遍历的数组

 * @param lsa 待遍历的数组的长度

 * @param ans 存储结果的数据

 * @param len 存储结果的数据的长度

 * @param sum 当前ans中数据的和

 * @param pos 当前遍历位置

 * @param res 需要得到的结果

 */
void fun(int ssa[], int lsa, int ans[], int len, int sum, int pos, int res)
{
    if (sum == res)
    {
        display(ans, len);
        return;
    }
    if (sum > res || pos >= lsa) return;

    fun(ssa, lsa, ans, len, sum, pos + 1, res);

    sum += ssa[pos];
    ans[len] = ssa[pos];
    fun(ssa, lsa, ans, len + 1, sum, pos + 1, res);
}

int main(int argc, char *argv[])
{
    int ss[32] = {0};
    int sa[] = {20, 30, 10, 50, 60};

    fun(sa, 5, ss, 0, 0, 0, 60);

    return 0;
}


[fly]存在即是合理[/fly]
2016-12-15 09:46
快速回复:ACM 一道题目 求大神给个思路或者代码
数据加载中...
 
   



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

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