标题:大家一起来做题:二维数组取数求和。给力--->给分!
只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:60 回复次数:18 
大家一起来做题:二维数组取数求和。给力--->给分!
输入一个n行m列(2 <= n <= 16 , 2 <= m <= 24)二维数组,每行的元素值都是0 1 2 3 …… m -1;要求从每一行取一个元素,使取得的n个元素的和等于m-1.问有多少种取法,并打印出每种取法对应的n个元素。

比如 3 * 4 的二维数组a   0 1 2 3
                         0 1 2 3
                         0 1 2 3
取数使a[0][?] + a[1][?] + a[2][?] = 3 有多少种取法,及其对应的3个数。取法数太大的可以不用打印对应元素。
搜索更多相关主题的帖子: 给力 
2012-01-21 01:25
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
得分:15 
#include"stdio.h"
#define n 3
#define m 4
int main()
{
  int a[n][m],i,j,k,count=0;
  printf("请输入一个%d行%d列的二维数组:\n",n,m);
  for(i=0;i<n;i++)
    for(j=0;j<m;j++)
     scanf("%d",*(a+i)+j);
  printf("输入的数组是:\n");
  for(i=0;i<n;i++)
  {
      for(j=0;j<m;j++)
      printf("%d ",a[i][j]);
      printf("\n");
  }
  for(i=0;i<m;i++)
      for(j=0;j<m;j++)
        for(k=0;k<m;k++)
            if(a[0][i]+a[1][j]+a[2][k]==m-1)
            {   
                printf("a[0][%d]+a[1][%d]+a[2][%d]=%d\n",i,j,k,m-1);
                count++;
            }
    printf("共有%d种情况.",count);
}
2012-01-21 11:26
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:15 
楼上貌似没仔细看题  先看一下数据范围  

n位的m进制数去压缩搜索  虽然空间复杂度降了点  但是时间复杂度还是 m^n  24^16 = 12116574790945106558976

而且楼上也没有压缩存储

[ 本帖最后由 laoyang103 于 2012-1-21 11:39 编辑 ]

                                         
===========深入<----------------->浅出============
2012-01-21 11:33
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
得分:0 
回复 3楼 laoyang103
呵呵 我是大一的,C语言才学了一个学期。(*^__^*) ,版主的话,我不太懂啊。那些复杂度什么的到底是什么意思?赐教啊。。。。
2012-01-21 11:41
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:15 
如老杨所说,随着N和M的增大,其取法数量是指数级增大的,输出每一种取法只适合于小范围内。
但只计算取法数量可以范围可以宽一些。这个问题与整数划分很相似,可以借鉴其中的思路。
大家先玩着,我暂不参与

重剑无锋,大巧不工
2012-01-21 12:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
----------------------------------->

梅尚程荀
马谭杨奚







                                                       
2012-01-21 12:16
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
没找到题目  也就没AC  我输入16 24 我输出的是1225

希望大家帮我测试下  原理杨大哥在上面已经说了  
程序代码:
#include <stdio.h>
#include <string.h>

int foot[32];
int sum;

void dfs(int m,int k,int index)
{
    if(index > k) return ;
    if(0 == m)
    {
        for(int i = 0;i<k;i++)
            printf("%d ",i<index?foot[i]:0);
        putchar('\n');
        sum++;
        return ;
    }
    int i;
    for(i = m;i;i--)
    {
        if(!index || i <= foot[index-1])
        { 
            foot[index] = i;
            dfs(m-i,k,index+1);
        }
    }
}

int main()
{
    int m,n;
    while(EOF != scanf("%d%d",&n,&m))
    {
        memset(foot,0,32);
        sum = 0;
        dfs(m-1,n,0);
        printf("%d\n",sum);
    }
    return 0;
}


                                         
===========深入<----------------->浅出============
2012-01-21 16:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 7楼 laoyang103
应该是错了。我的计算结果是15471286560。
这个问题的等价问题是将m - 1个相同的小球放到n个不同的盒子里。
以n = 2, m = 3为例,其取法应该有3种
0 2
1 1
2 0

0 2与2 0是两种不同的取法。这是与整数划分不同的地方。

重剑无锋,大巧不工
2012-01-21 17:41
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 8楼 beyondyf
杨大哥确实眼光犀利。

梅尚程荀
马谭杨奚







                                                       
2012-01-22 05:19
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
做学生真好啊,清晨5点就起来上网了,不要告诉我你昨晚通宵了

喜欢你们这种学习的激情。今天也就这一次上线了,龙年见!

该去帖对联了。

重剑无锋,大巧不工
2012-01-22 09:03



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




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

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