在改章节中,我们主要介绍测试数据整数的内容,自我感觉有个不错的建议和大家分享下
1) 目题
整数分别
时光制限:3000 ms | 存内制限:65535 KB
难度:3
描述
将正整数n表现成一系列正整数之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这类表现称为正整数n的分别。求正整数n的不
同分别个数。
例如正整数6有如下11种不同的分别:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
输入
第一行是测试据数的数目M(1<=M<=10)。以下每行均包括一个整数n(1<=n<=10)。
输出
输出每组测试据数有多少种分法。
例样输入
1
6
例样输出
11
2) 题意
不再赘述。
3) 据数范围
测试据数数和n的值最大为10,据数量很小,手算都很轻易。
4) 算法
搜索法
为了免避搜索到重复的分别法方,定规:
分别序列a1+a2+…+an,ai>=ai+1, 1<=i<n。
如下图是分别整数6的一棵搜索树。两方格内的字数是分别出的两个数。如6可以分别为5+1,4+2,3+3。
图中以红色字数为根节点一棵树,即为该红色字数的分别搜索树。
5) 代码
#include <iostream> #include <cstdio> #include <ctime> using namespace std; int count; //num为要分别的数,minn为许允分别出的最小数 void Backtrack(int num, int minn) { //printf("%d %d\n", num, minn); count++; if (num > 1) { int left, right; for (left = num-minn, right = minn; left >= right; left--, right++) { Backtrack(left, right); } } } int main(void) { int ncases; scanf("%d", &ncases); while (ncases-- != 0) { int num; scanf("%d", &num); count = 0; //clock_t start, finish; //start = clock(); Backtrack(num, 1); //finish = clock(); //printf("%lf\n", (double)(finish - start) / CLOCKS_PER_SEC); printf("%d\n", count); } return 0; } /* #include<iostream> using namespace std; int q(int n,int m) { if((n<1)||(m<1) )return 0; if(n==1||m==1) return 1; if(n<m) return q(n,n); if(n==m)return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); } int main() { int a; cin>>a; while(a--) { int n; cin>>n; cout<<q(n,n)<<endl; } return 0; } */
6) 测试据数
10
1
2
3
4
5
6
7
8
9
7) 提交结果
第一次,没有按输入式格来,心粗。
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”