看了个数据结构的题,好沮丧,都怀疑自己智商了.....不知道大家遇到是什么情况....
看到这个题,别说动手写算法了,连怎么分析都不知道。这好像不仅仅是编程能力的问题。不仅怀疑一自己的这种分析能力,能在编程上走的远站得高么{:5_100:}(说白了就是怀疑自己智商了)。。同志们说说你们看后的情况。有一看完题目,就出思路的么。。。。。。。
明天我再发出书上给的参考算法思路。file:///C:%5CDocuments%20and%20Settings%5CAdministrator%5CApplication%20Data%5CTencent%5CUsers%5C1399470763%5CQQ%5CWinTemp%5CRichOle%5C%D$QMYN8%28G1%7B27A2
自己顶一个........................ 没感觉! 本帖最后由 服气 于 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)
===没思路,只能看4楼的解法了,555555~难道吾智商有问题:Q? 第一直觉,用递归比较好解决,期待其它同志们比较好的答案。 很牛B,学习 了
应该是种计算方法吧。。。。是不是公式啊? 我连这道题是什么意思都不知道,怎么办? 过来看看吧!! 第一眼感觉就是递归~~~,然后,就没有然后了:funk: 题目的意思就是一个数可以由多少个数组成(不分顺序),有点像统计概率里面的取球的那种例子。 看了下题目,一般我拿到题目,我不急着写代码,分析问题,大致想下题目该用什么方法做比较好,能后找到题目中的关键点,进行算法描述!
看到此题我的第一想法就是用递归.
算法描述我不写了,代码注释里有,不懂问我!#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;
} 还差1个鱼币 看看 顶一个 {:9_227:} 排列组合,为了避免重复,就如题中举例,划分数有大到小排列,比如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) 这题目上面各位已经讲了,从八皇后里学到了一个yield,不得不用一下。。。
页:
[1]