栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一周总结:11.8~11.14——递归,贪心(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一周总结:11.8~11.14——递归,贪心(C++)

从n个数中取r个数进行组合-递归

【问题描述】
  找出 n个自然数中取 r 个数的组合。
【输入格式】
  n   r
【输出格式】
  枚举所有可能
【样例】
  in:
5
3
  out:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1

#include 
int a[100];
void combrecur(int n, int r)
{
    for(int i=n; i>=r; i--){
        a[r]=i;
        if(r>1){
            combrecur(i-1,r-1);
        }else{
            for(int j=a[0];j>0;j--){
                printf("%d",a[j]);
                printf(" ");
            }
            printf("n");
        }
    }
}
void main()
{
    int n,r;
    scanf("%d %d",&n,&r);
    if(n>r){
        a[0]=r;
        combrecur(n,r);
    }
}
分糖果-贪心

【问题描述】
  已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s大于等于某个孩子的需求因子g时,代表该糖果能满足孩子;问用这些糖果,最多能满足多少孩子?(注意:每个孩子最多只能用一个糖果满足)
【输入格式】
  第一、二行输入两个数n和m,分别代表g和s的个数
  第三行为需求因子数组g
  第四行为糖果大小数组s
【样例】
  in:
6
5
5 10 2 9 15 9
6 1 20 3 8
  out:
3
【解题思路】
  贪心算法的经典例题。当糖果的大小“刚好”满足孩子的需求因子时(刚好就大一点),最“贪心”,因此,首先要让两个数组排序,这样才能通过比较得出较优解。通过比较,选出能满足孩子的糖果(遍历两个数组)。在这题中,我们只需要求出糖果最多能满足多少孩子即可。

#include 
#include 
#include 
using namespace std;

int findContentChildren(std::vector& g, std::vector& s){
	std::sort(g.begin(),g.end());
	std::sort(s.begin(),s.end());			//排序
	int child = 0;
	int cookie = 0;							//定义child和cookie变量,表示现在到第几个数
	while(child < g.size() && cookie < s.size()) {		//循环范围
		if(g[child] <= s[cookie]){
			child++;						//如果满足条件,意味着满足了一个孩子,child+1
		}
	    cookie++;							//cookie变量无论有无满足孩子都要+1
	}
	return child;							//返回满足的孩子数
}

int main(){
	std::vector g;
	std::vector s;
	int n,m;
	cin >> n >>m;
	int a,b;
	for(int i=0; i> a;
		g.push_back(a);
	}
	for(int j=0; j> b;
		s.push_back(b);
	}   
	
	cout< 
最大分解-贪心 

【问题描述】
  给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值
【输入格式】
  输入仅一行,包含一个正整数n
【输出格式】
  一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值
【样例】
  in:10
  out:6
【样例说明】
  p=2
  a0=10,a1=5,a2=1,6=5+1
【思路】
  这是一个对贪心的小练习,约数:当a能整除b,那么a就是b的约数(即:b>a)。题目要求是给定一个整数n,找出一组递减的数,里面的数都小于n并且前一个都能被后一个整除,因此能想到用for循环(while也可),遍历小于n的所有整数,看看它们是否能整除前一个数,如果可以,即符合题目要求,计算它们的总和。

#include 
using namespace std;

int fun(int n,int sum){

    for(int i=n-1; i!=0; i--){		 //一开始是用双重for,后来发现一层就可以解决了
    	if(n%i==0){
		   sum += i;			    //计算所有i的总和,i既是符合题目要求的数
		   n=i;                     //这里是重点,记得要把i赋值给n
        }
	}

	return sum;
}

int main(){
	int n,sum;
	sum=0;
	cin>>n;
	cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号