C语言题,求高手指教。。。。
ProblemDescription"Well,itseemsthefirstproblemistooeasy.Iwillletyouknowhowfoolishyoua...
Problem Description
"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.
"The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+...+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
Sample Input
4
10
20
Sample Output
5
42
627
它的代码:
#include <stdio.h>
int num[121][121]={0};
int q(int m,int n)
{
if(m==0)
m=1;
if(n>m)
n=m;
if(num[m][n]==0)
{
num[m][n]=q(m,n-1)+q(m-n,n);
}
return num[m][n];
}
int main()
{
int m,i;
for(i=1;i<121;i++)
{
num[1][i]=1;
num[i][1]=1;
}
while(~scanf("%d",&m))
{
printf("%d\n",q(m,m));
}
return 0;
}
求解:q函数什么意思。。。。 展开
"Well, it seems the first problem is too easy. I will let you know how foolish you are later." feng5166 says.
"The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+...+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that "4 = 3 + 1" and "4 = 1 + 3" is the same in this problem. Now, you do it!"
Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.
Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.
Sample Input
4
10
20
Sample Output
5
42
627
它的代码:
#include <stdio.h>
int num[121][121]={0};
int q(int m,int n)
{
if(m==0)
m=1;
if(n>m)
n=m;
if(num[m][n]==0)
{
num[m][n]=q(m,n-1)+q(m-n,n);
}
return num[m][n];
}
int main()
{
int m,i;
for(i=1;i<121;i++)
{
num[1][i]=1;
num[i][1]=1;
}
while(~scanf("%d",&m))
{
printf("%d\n",q(m,m));
}
return 0;
}
求解:q函数什么意思。。。。 展开
4个回答
展开全部
这道题不理解思路是不能理解函数的 ACM的题讲清思路要打好多字~
加30分悬赏我给你打详细点
p[m][n] 表示 以n为最大数的m有多少种分法 并递归出 p[m][n-1]
例:p[4][4] 表示 4 = 4 1种
p[4][3] 4 = 3 + 1 1种
p[4][2] 4 = 2 + p[2][2] (p[2][2] 2 = 2 1种 p[2][1] 2 = 1 + 1 1种 共2种)
p[4][1] 4 = 1 + 1 + 1 +1 1种
共5种
#include <stdio.h>
int num[121][121]={0};
int q(int m,int n)
{
if(m==0)
m=1;
if(n>m)
n=m;
if(num[m][n]==0)
{
num[m][n]=q(m,n-1)+q(m-n,n);
}
printf("%d %d %d\n",m,n,num[m][n]);
return num[m][n];
}
int main()
{
int m,i;
for(i=1;i<121;i++)
{
num[1][i]=1;
num[i][1]=1;
}
while(~scanf("%d",&m))
{
printf("%d\n\n",q(m,m));
}
return 0;
}
用这个你可以观察下规律
加30分悬赏我给你打详细点
p[m][n] 表示 以n为最大数的m有多少种分法 并递归出 p[m][n-1]
例:p[4][4] 表示 4 = 4 1种
p[4][3] 4 = 3 + 1 1种
p[4][2] 4 = 2 + p[2][2] (p[2][2] 2 = 2 1种 p[2][1] 2 = 1 + 1 1种 共2种)
p[4][1] 4 = 1 + 1 + 1 +1 1种
共5种
#include <stdio.h>
int num[121][121]={0};
int q(int m,int n)
{
if(m==0)
m=1;
if(n>m)
n=m;
if(num[m][n]==0)
{
num[m][n]=q(m,n-1)+q(m-n,n);
}
printf("%d %d %d\n",m,n,num[m][n]);
return num[m][n];
}
int main()
{
int m,i;
for(i=1;i<121;i++)
{
num[1][i]=1;
num[i][1]=1;
}
while(~scanf("%d",&m))
{
printf("%d\n\n",q(m,m));
}
return 0;
}
用这个你可以观察下规律
追问
你怎么这么坏。。。。
追答
都76浏览了 加吧 不亏嘛 嘿
展开全部
f[m][n]的含义应该是 把m分成n个有多少种分法
num[m][n]=q(m,n-1)+q(m-n,n); 这个是重点
把m分成n个的方法数等于 把m 分成n-1份的方法数+剩余数值可分的方法数
这应该是ACM入门题目
num[m][n]=q(m,n-1)+q(m-n,n); 这个是重点
把m分成n个的方法数等于 把m 分成n-1份的方法数+剩余数值可分的方法数
这应该是ACM入门题目
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是一个利用递归求可能的个数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一题选D
(题解有些长,但很详细)
{1}
题解:首先判断语句“(--y==x++)
?”的意思是--y是否等于x++【--y指用y的值减1(也就是符号--)再使用,所以这时y=9。x++的指先使用x的值,再用x的值增1(也就是符合++),所以这时x=5
不变,你可能会问x增1了
x不是等于6吗?你要注意增1运算符是在x后面的,就说明是先使用x的值,再用x的值增1,增1后的值(也就是6)保存在内存里留着后面使用】。
{2}
经过一比较9=5不成立,就选择冒号(:)后面的语句(++x)【你可能不懂“?”和“:”是什么意思。
它们是条件运算符,要和在一起用。先判断“?”前的条件表达式(就如“(--y==x++)
?”)是否成立。如果成立就选择冒号前的表达式(就如“
--y”),如果不成立就选择冒号后的表达式(就如“++x”)】。
所以这时“a=(--y==x++)
?
-y
:
++x”也就相当于“a=++x”
就是
a=7
(之前x不是有一个增1的值(6)保存在内存里留着的吗,现在就把它用了。++x=7
++x是先增1
后使用所以6增1得7,然后使用。)
{3}
“b=y++
;
c=x
”的意思是把“y++”的值赋给“b”。y先使用后增1,所以
b=9
。“c=x”也就是
c=x=7。
第二题
a=10
b=10
c=10
和第一题差不多,也是先使用后增1(减1)或者先增1(减1)后使用的关系。
还有
那个条件运算符要注意哦
【先判断“?”前的条件表达式(就如=(x--=y++)?
”)是否成立。如果成立就选择冒号前的表达式(就如“
x--
”),如果不成立就选择冒号后的表达式(就如“y++
”)。】
(题解有些长,但很详细)
{1}
题解:首先判断语句“(--y==x++)
?”的意思是--y是否等于x++【--y指用y的值减1(也就是符号--)再使用,所以这时y=9。x++的指先使用x的值,再用x的值增1(也就是符合++),所以这时x=5
不变,你可能会问x增1了
x不是等于6吗?你要注意增1运算符是在x后面的,就说明是先使用x的值,再用x的值增1,增1后的值(也就是6)保存在内存里留着后面使用】。
{2}
经过一比较9=5不成立,就选择冒号(:)后面的语句(++x)【你可能不懂“?”和“:”是什么意思。
它们是条件运算符,要和在一起用。先判断“?”前的条件表达式(就如“(--y==x++)
?”)是否成立。如果成立就选择冒号前的表达式(就如“
--y”),如果不成立就选择冒号后的表达式(就如“++x”)】。
所以这时“a=(--y==x++)
?
-y
:
++x”也就相当于“a=++x”
就是
a=7
(之前x不是有一个增1的值(6)保存在内存里留着的吗,现在就把它用了。++x=7
++x是先增1
后使用所以6增1得7,然后使用。)
{3}
“b=y++
;
c=x
”的意思是把“y++”的值赋给“b”。y先使用后增1,所以
b=9
。“c=x”也就是
c=x=7。
第二题
a=10
b=10
c=10
和第一题差不多,也是先使用后增1(减1)或者先增1(减1)后使用的关系。
还有
那个条件运算符要注意哦
【先判断“?”前的条件表达式(就如=(x--=y++)?
”)是否成立。如果成立就选择冒号前的表达式(就如“
x--
”),如果不成立就选择冒号后的表达式(就如“y++
”)。】
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询