牛客 求和

博客围绕从数列1到n中取数使其和等于m的题目展开,给出基本思路,即把数m拆分,如分成1+(m - 1)、2+(m - 2)等,再对拆分后的数继续拆分,最后提到有AC解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来

输入描述:

每个测试输入包含2个整数,n和m

输出描述:

按每个组合的字典序排列输出,每行输出一种组合

 

基本思路:假设有一个数m,将m分成 1+(m-1)、2+(m-2)…………m/2+m/2。然后再将(m-1)分为2+(m-3)、3+(m-4)等等,将(m-2)分成3+(m-5),4+(m-6)。依次输出就好

AC解:

#include<vector>
#include<iostream>
using namespace std;

void Find(vector<int> &Res ,int Now_Sum,int Now_Value,int n)
{
	if(Now_Sum<=n)
	{
		for (int i = 0; i < Res.size(); i++)
		{
			cout << Res[i] << ' ';
		}
		cout << Now_Sum << endl;
	}
	
	for (int i = Now_Value; i <= Now_Sum/2; i++)
	{
		
		if ((Now_Sum - i) > i)
		{
			int T_Now_Sum = Now_Sum - i;
			vector<int> T_Res = Res;
			T_Res.push_back(i);
			int T_Now_Value = i + 1;
			Find(T_Res, T_Now_Sum, T_Now_Value, n);
		}
	}
}

int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i < n; i++)
    {
	    if (m - i > i)
	    {
		    vector<int> Temp;
		    int Now_Sum = m - i;
		    int Now_Value = i + 1;
		    Temp.push_back(i);
		    Find(Temp, Now_Sum, Now_Value,n);
	    }
    }
    if(n>=m) cout << m;
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值