乘风 发表于 2012-8-16 21:56:35

看了个数据结构的题,好沮丧,都怀疑自己智商了.....不知道大家遇到是什么情况....


看到这个题,别说动手写算法了,连怎么分析都不知道。这好像不仅仅是编程能力的问题。不仅怀疑一自己的这种分析能力,能在编程上走的远站得高么{:5_100:}(说白了就是怀疑自己智商了)。。同志们说说你们看后的情况。有一看完题目,就出思路的么。。。。。。。

明天我再发出书上给的参考算法思路。file:///C:%5CDocuments%20and%20Settings%5CAdministrator%5CApplication%20Data%5CTencent%5CUsers%5C1399470763%5CQQ%5CWinTemp%5CRichOle%5C%D$QMYN8%28G1%7B27A2

乘风 发表于 2012-8-16 23:39:52

自己顶一个........................

收藏点滴 发表于 2012-8-17 08:44:49

       没感觉!

服气 发表于 2012-8-17 11:58:07

本帖最后由 服气 于 2012-8-17 12:05 编辑

6=1+1+1+1+1+1   
6=2    +1+1+1+1
6=3      +1+1+1
6=4            +1+1
6=5                +1
6=1+1+1+1+2去掉
6=2    +1+1+2
6=3      +1+2
6=4            +2

6=1+1+1+3去掉
6=2    +1+3
6=3      +3

6=1+1+4去掉
6=2    +4


6=1+5 去掉
用归纳法
找找规律就出来了

划分数计算公式 :(((n-1)+1)×(n-1))/2)-(n-2)

、回憶 发表于 2012-8-20 23:34:30

===没思路,只能看4楼的解法了,555555~难道吾智商有问题:Q?

蓝色旋律 发表于 2012-8-23 14:18:13

第一直觉,用递归比较好解决,期待其它同志们比较好的答案。

1986river 发表于 2012-9-27 02:24:53

很牛B,学习 了

wang_叻 发表于 2013-1-10 12:08:13

应该是种计算方法吧。。。。是不是公式啊?

wojiao什么 发表于 2013-1-11 19:46:51

我连这道题是什么意思都不知道,怎么办?

xii123 发表于 2013-1-14 11:39:17

过来看看吧!!

不能为空 发表于 2013-2-3 19:06:48

第一眼感觉就是递归~~~,然后,就没有然后了:funk: 题目的意思就是一个数可以由多少个数组成(不分顺序),有点像统计概率里面的取球的那种例子。

你|若|问|我 发表于 2013-2-5 18:28:30

看了下题目,一般我拿到题目,我不急着写代码,分析问题,大致想下题目该用什么方法做比较好,能后找到题目中的关键点,进行算法描述!
看到此题我的第一想法就是用递归.
算法描述我不写了,代码注释里有,不懂问我!#include<stdio.h>
#include <conio.h>
int count=0;
void function(int n,int t)//第二个两个参数的目的是在递归的时候进行判断
{
        int k;
        for(int i=1;i<n;i++){//有规律可以知道都要循环n次
                k=n-i;          //k为分解的第一个数,i为分解的第二个数
                if (k<=t && i<=k )//当满足第一个数要小于递归传来的前面的值,第二个值要小于第一个值
                {
                        count++;//统计个数
                        function(i,k);//再次递归
                }
                else if (i>k && k<=t)//当第二个大于第一个数的时候,这个不满足
                {
                        function(i,k);//仅递归,不统计个数
                }               
        }
}
void main()
{
        int n;
        scanf("%d",&n);
        function(n,n);
        printf("%d",count+1);//因为当函数调用的循环是从第一个开始,所以这里加1
        getch();
}
网上另一解法源码:#include<iostream>
using namespace std;
int divide(int n , int m)
{
if(n < 1 || m < 1) return 0;
if(n == 1 || m == 1) return 1;
if(n == m) return (divide(n , m - 1) + 1);
if(n < m ) return divide(n , n);
if(n > m ) return (divide(n , m - 1) + divide(n - m,m));
}
int main()
{
int t;
cin>>t;
cout<<divide(t , t)<<endl;
return 0;
}

y290176346 发表于 2015-9-16 22:01:59

还差1个鱼币

Damn_it 发表于 2016-11-26 18:36:14

看看

hannibal_zj 发表于 2017-4-12 14:20:51

顶一个

编程爱好者kguj 发表于 2020-6-5 23:07:25

{:9_227:}

java2python 发表于 2020-6-6 01:13:30

排列组合,为了避免重复,就如题中举例,划分数有大到小排列,比如6=5+1,这样1+5就不行
递归:从6里取2作为第一个的话,剩余4再划分时,不能超过2,这样就不会出现3,2,1,然后2,3,1再来一遍的情况:
def fulldivision(n,limit,state):
    if n==1 or n == 0:
      yield (n,)
    else:
      for i in range(min(n,limit),0,-1):
            for result in fulldivision(n-i,i,state + (i,)):
                yield (i,) + result
c = 0
for res in fulldivision(6,6,()):
      c += 1
      print ('Solution %d: ' % c,res)
结果如下:
Solution 1:(6, 0)
Solution 2:(5, 1)
Solution 3:(4, 2, 0)
Solution 4:(4, 1, 1)
Solution 5:(3, 3, 0)
Solution 6:(3, 2, 1)
Solution 7:(3, 1, 1, 1)
Solution 8:(2, 2, 2, 0)
Solution 9:(2, 2, 1, 1)
Solution 10:(2, 1, 1, 1, 1)
Solution 11:(1, 1, 1, 1, 1, 1)

java2python 发表于 2020-6-6 01:17:49

这题目上面各位已经讲了,从八皇后里学到了一个yield,不得不用一下。。。
页: [1]
查看完整版本: 看了个数据结构的题,好沮丧,都怀疑自己智商了.....不知道大家遇到是什么情况....