| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1740 人关注过本帖, 1 人收藏
标题:向大神们请教个问题,求看我这个代码哪里错了。
只看楼主 加入收藏
Tic_Kurt
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-18
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:17 
向大神们请教个问题,求看我这个代码哪里错了。
这段代码要写的是输入最大值m,和n个数,求n个数任意相加与m值最接近的值是多少。
程序代码:
#include <stdio.h>
#define N 30
int a[N],end;
void zuhe(int n,int k,int m,int a[N])
{
    int i,j,w=0;
    for(i=n;i>=k;i--)
    {
        if(k>1) zuhe(i-1,k-1,m,a[i]);
        else
        {
            for(j=1;j<=end;j++)
            w+=a[j];
                printf("%d ",w);
            printf("\n");
        }
    }
}
void main()
{
    int n,m,k,d;
    scanf("%d %d",&m,&n); 
    end=n;
    d=n;
    int a[d],i,j,w;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
       while(k<n){
           zuhe(n,k,m,a[i]);
           k++;
    }
}
搜索更多相关主题的帖子: 代码 int end for printf 
2017-11-18 19:58
Tic_Kurt
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-18
收藏
得分:0 
程序小白一枚,写这段代码用了递归调用,可是不怎么会用...自己写了这么一段程序,不知道怎么错了,还请各位大神教教我。
2017-11-18 20:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这应该是属于算法里面的背包问题吧~
就是背包问题里面的物品价值等于物品重量~
不过我还不会~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-18 20:07
Tic_Kurt
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-18
收藏
得分:0 
回复 3楼 九转星河
是ACM的刚入门题,我刚刚去查背包问题,看起来确实很像。而且比背包问题简单了很多,不用考虑重量与价值的关系,我这个代码去解决的思路是,先算出所有可能的情况,然后去找最合适的一种。

[此贴子已经被作者于2017-11-18 20:14编辑过]

2017-11-18 20:12
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
是不是这意思:n中任意组合之和与m之差的绝对值较少者
2017-11-18 20:20
Tic_Kurt
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-18
收藏
得分:0 
回复 5楼 吹水佬
对对对,n是个自由数列,自己输入的。
2017-11-18 20:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 Tic_Kurt
这样思路的确简单很多~
不过这种算法代码要解也要花很多时间去看~
这种调试还是自己写的本人对思路比较熟悉最好还是自己慢慢发现问题~
虽然可以剪枝掉比m和当前某个最接近m的精度值的之和还要大的~不过话说穷举所有情况这样的算法时间复杂度是非二项式的~

真的要做的话全部组合实质是遍历满二叉树~抽象化就是左子树为0右子树为1,遍历路径就是该组合的状态~那种形式的递归求全部组合会简单很多~


PS:打脸的是某ACM成员曾经说背包问题是最基的ACM问题~属于入门级别的~特别是这种01背包问题~感觉自己不会多少有点无语~

https://bbs.bccn.net/thread-481922-1-1.html

记得数据结构曾经发了一贴就是科普一下背包问题的还没有人回~所以我对这类问题还是先放放了~

[此贴子已经被作者于2017-11-18 20:39编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-18 20:30
Tic_Kurt
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-11-18
收藏
得分:0 
回复 7楼 九转星河
谢谢大佬的回复,虽然有点看不懂。。。我太菜的锅,我重新写一遍试试。
看大佬的签名发现我的程序真的是可读性太差了,以后得注意,养成好习惯。
2017-11-18 20:40
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 Tic_Kurt
以下是引用Tic_Kurt在2017-11-18 20:40:56的发言:

谢谢大佬的回复,虽然有点看不懂。。。我太菜的锅,我重新写一遍试试。
看大佬的签名发现我的程序真的是可读性太差了,以后得注意,养成好习惯。


其实高端点的算法可读性感觉难懂是很正常的~不然数据结构也没有传说中那么多会挂科的~

其实你那个程序我其实都没有怎么看~用心一点看的话说不定能看出一大堆BUG~

写点可读性比较好一点的有时并不是那么简单的~论可读性的话你可以看看r版大佬的代码~分分钟让你知道什么叫可读性~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-18 20:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
嗯,帮你完成一半了~
还有另外一半自己试试结合题意加上~

程序代码:
#include<stdio.h>
#include<stdlib.h>

#define N 10

typedef struct Array
{
    int data;
    unsigned visit;
}Array;

void input(Array arr[] ,size_t len);
void print(Array arr[] ,size_t len);

void fun(Array arr[],size_t deep,size_t len);

int main( void )
{
   Array arr[N];
   int m=5;
   
   memset(arr,0,sizeof (arr));
   
   input(arr,m);
   
   fun(arr,0,m);
   
   
    return 0;
}

void input(Array arr[],size_t len)
{
    size_t i=0;
    
    if (len>N)
        exit(0);
        
    for (i=0;i!=len;++i)
        if (!scanf("%d",&arr[i].data))
            exit(0);
}

void print(Array arr[],size_t len)
{
        size_t i=0;
        
        for (i=0;i!=len;++i)
            if (arr[i].visit)
                printf("%-4d",arr[i].data);
                
       puts("");
}

void fun(Array arr[],size_t deep,size_t len)
{
    if (deep==len)
        return ;
     
    arr[deep].visit^=1;
    
    print(arr,len);
           
    fun(arr,deep+1,len);
    
    arr[deep].visit^=1;
    
    fun(arr,deep+1,len);
    
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-11-18 21:56
快速回复:向大神们请教个问题,求看我这个代码哪里错了。
数据加载中...
 
   



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

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