1.   数字分解

【问题描述】

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,当n等于5时有6种拆分方法:

5=1+1+1+1+1

5=1+1+1+2

5=1+1+3

5=1+2+2

5=1+4

5=2+3

输入:一行包含一个正整数n(1<n<10)。

输出:先将拆分方案输出,然后再输出拆分的方案数。

【输入样例】

5

【输出样例】

5=1+1+1+1+1

5=1+1+1+2

5=1+1+3

5=1+2+2

5=1+4

5=2+3

total=6

#include <iostream>
using namespace std;
int a[] = {},n,total; //输出函数
void print(int t) { //拆成t项
cout << n << "=";
for(int i = ; i <= t-; i++) {
cout << a[i] << "+";
}
cout << a[t] << endl;
total++;
} void find(int m,int t) {
for(int i = a[t-]; i<=m; i++) {
if(i < n) {
a[t] = i; //保存当前拆分的i
m-=i;
if(m ==) { //拆分结束,输出结果
print(t);
} else {
find(m,t+);
}
m+=i; //回溯:加上拆分的数,以便产生所有可能的拆分
}
}
}
int main() {
cin >> n;
find(n,);
cout << "total=" <<total << endl;
return ;
}

2.放苹果

【问题描述】

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出:对输入的每组数据M和N,用一行输出相应的K。

【输入样例】

1

7 3

【输出样例】

8

/*
m个苹果放在n个盘子中,那么定义函数为apple(m,n): 1.m=0,没有苹果,那么只有一种放法,即apple(0,n)=1 2.n=1,只有一个盘中,不论有或者无苹果,那么只有一种放法,apple(m,1)=1 3.n>m,和m个苹果放在m个盘子中是一样的,即apple(m,n)=apple(m,m) 4.m>=n,这时分为两种情况,一是所有盘子都有苹果,二是不是所有盘子都有苹果。
不是所有盘子都有苹果和至少有一个盘子空着是一样的,即=apple(m,n-1)。所
有盘子都有苹果,也就是至少每个盘子有一个苹果,m个苹果中的n个放在n个盘子中,
剩下的m-n个苹果,这和m-n个苹果放在n个盘子中是是一样的,即=apple(m-n, n)。
这时,apple(m,n)=apple(m-n, n)+apple(m,n-1)。
*/
#include<iostream>
using namespace std;
int apple(int m,int n) { //m个苹果放到n个盘子里
if(m < || n <){
return ;
}
//判断只有一个方法放苹果的情况
if(m== || n==){
return ;
}
//否则判断苹果数是否少于盘子数,如果少,那么肯定有n-m个空盘子
//所以只要做把m个苹果放到m个盘子里
else if(m<n) {
return apple(m,m);
}
//m>=n的情况 :
//所有的盘子都有苹果,即只要把m-n个苹果放到n个盘子里
//不是所有盘子都有苹果和至少有一个盘子空着是一样的,即=apple(m,n-1)
else {
return apple(m-n,n)+apple(m,n-);
} }
int main() {
int t;
cin>>t;
while(t--) {
int m,n;
cin>>m>>n;
cout<<apple(m,n)<<endl;
}
}

1.全排列

【问题描述】

输入一个数字N(1<N<10),输出所有使用1到N数字组成的N位数(每个数字只能使用一次)。

【样例输入】

3

【样例输出】

123

132

213

231

312

321

#include <iostream>
using namespace std;
int a[],book[],n; //站在第step个盒子面前
void dfs(int step){
int i;
if(step == n+){
//输出一种全排列
for(i = ;i<=n;i++){
cout << a[i];
}
cout << endl;
return; //返回之前的一步,最近一次调用dfs函数的地方
} //站在第step个盒子面前, 遍历1到n一一去尝试
for(i = ;i <= n;i++){
//判断该数字是否还未被使用
if(book[i] == ){
a[step] = i;
book[i] = ;//表示已被使用 //接下里走到step+1的盒子面前,做同样的操作
dfs(step+);
book[i]=;//一定要将刚才尝试的数字收回,才能进行下一次的尝试
}
} return;
}
int main(){
cin >> n;
dfs();
return ;
}

2.分为互质组

【问题描述】

给定n个正整数,将他们分组,使得每组中任意两个数互质。至少要分成多少个组?

输入:第一行是一个正整数n,1<=n<=10;第二行是n个不大于10000的正整数。

输出:一个正整数,即最少需要的组数。

【输入样例】

6

14 20 33 117 143 175

【输出样例】

3

#include <iostream>
using namespace std;
int a[],b[],n;
int ans;
//定义gcd函数求两个数的最大公约数
int gcd(int a,int b) {
if(b==) {
return a;
} else {
return gcd(b,a%b);
}
}
void dfs(int x,int y) { //x:第几个数 y:已有多少组
//递归终止条件
if(x>n) {
ans = y;
return;
}
bool flag = false;
//判断当前值是否是属于已有组
for(int i = ; i <=y; i++) {
bool pd = true;
for(int j = ; j < x; j++) {
//第j个元素属于第i组,并且第x个元素与第j个元素不是互为质数,则a[x]不属于第i组
if(b[j] == i && gcd(a[x],a[j]) != ) {
pd = false;
break;
}
}
if(pd == true) { //第x个元素与第i组的所有元素都互为质数
flag = true;
//第x个元素属于第i组
b[x] = i;
//接着判断下一个元素(第x+1个元素)是否属于已有的y组
dfs(x+,y);
//将b[x]重新赋值为0
b[x]=;
}
}
if(flag == false) {
//如果当前值不属于已有的任何一组 需要新开一个组别
//第x个元素属于第y+1组
b[x] = y+;
//接着判断下一个元素(第x+1个元素)是否属于已有的y+1组
dfs(x+,y+);
b[x] = ;
}
}
int main() {
cin >> n;
for(int i = ; i <=n; i++) {
cin >> a[i];
}
//初始化b数组,第1个元素属于第1组
b[] = ;
dfs(,);
cout << ans << endl;
return ;
}

noip第22课作业的更多相关文章

  1. noip第5课作业

    1.     计算税收 [问题描述] 对某产品征收税金,在产值1万元以上收税5%:在1万元以下但在5000元或者以上的征收税3%:在5000元以下但在1000元或以上征收税2%:1000元以下的免收税 ...

  2. noip第22课资料

  3. noip第34课作业

    1.    信息加密 [问题描述] 在传递信息的过程中,为了加密,有时需要按一定规则将文本转换成密文发送出去.有一种加密规则是这样的:1. 对于字母字符,将其转换成其后的第3个字母.例如:A→D,a→ ...

  4. noip第33课作业

    1.    排座椅 [问题描述] 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同 ...

  5. noip第29课作业

    1.   钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...

  6. noip第28课作业

    分段数列 [问题描述] 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入格式: 输入第1行包含两个正整 ...

  7. noip第27课作业

    1. 繁忙的都市 [问题描述] 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个 ...

  8. noip第26课作业

    1.    信使 [问题描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指 ...

  9. noip第25课作业

    1.   求一个有向图所有顶点入度的和 输入有向图的顶点个数,边数以及各顶点之间的关联情况,要求求出这个有向图的所有顶点入度的总和. [输入格式] 第1行:2个空格分开的整数n(2<=n< ...

随机推荐

  1. BZOJ4326或洛谷2680 运输计划

    BZOJ原题链接 洛谷原题链接 用\(LCA\)初始化出所有运输计划的原始时间,因为答案有单调性,所以二分答案,然后考虑检验答案. 很容易想到将所有超出当前二分的答案的运输计划所经过的路径标记,在这些 ...

  2. Scrapy框架——CrawlSpider类爬虫案例

    Scrapy--CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spide ...

  3. python-bs4的使用

    BeautifulSoup4 官方文档 是一个Python库,用于从HTML和XML文件中提取数据.它与您最喜欢的解析器一起使用,提供导航,搜索和修改解析树的惯用方法.它通常可以节省程序员数小时或数天 ...

  4. [Robot Framework] Robot Framework怎么调试?

    Robot Framework怎么debug? 在eclipse里面安装一个插件,就可以debug robot framework的project. 插件下载地址: https://github.co ...

  5. Intellij idea 系列教程目录

    Intellij idea 系列教程目录 Intellij idea 系列教程之破解方法 Intellij idea 系列教程之常用快捷键 Intellij idea 系列教程之常用配置项 每天用心记 ...

  6. sqlserver sql 循环

    通过临时表进行sql循环 -----------创建临时表-------------- SELECT * INTO #tempfensitocity FROM( SELECT * FROM dbo.S ...

  7. 局外者看 -- 美团 vs 滴滴

    1. 美团 美团外面 美团打车 美团云服务 2. 滴滴 滴滴打车 滴滴外面 滴滴云服务 这是一场企业级别的战争,而且是本土战争,时间开始于何时,不知道,现在写这个博客的时间是2018年3月21日下午. ...

  8. [html]Sublime Text添加插件

    今天想在Sublime Text(简称ST)内编写HTML后直接使用浏览器看效果,想添加View in Browser插件,然后遇到奇怪的问题添加插件直接报"找不到有用的插件" 一 ...

  9. WPF禁止拖拽窗口到边缘自动最大化

    近期有个需求,可以通过拖拽改变窗口大小,但是不允许窗口最大化.最小化.拖到边缘的时候也不能自动最大化. 要想禁止拖拽窗口到边缘自动最大化,只要改注册表即可,但是系统所有应用都会被禁止. 1.运行reg ...

  10. 20155312 2016-2017-2《Java程序设计》课程总结

    20155312 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:做中学learning by doing个人感想 ...