【和小安一起刷题】POJ3187 Backward Digit Sums ----穷竭搜索

01、题目描述

小伙伴们大家好,这里是和 【和小安一起刷题 】 系列栏目,今天我们要做的是一道简单的穷竭搜索(也就通常所说的爆搜)加上一点点小技巧就可以解决的题目——POJ3187 Backward Digit Sums, 下面是题目的链接与描述。

题目链接: POJ3187 Backward Digit Sums.
题目描述:输入n,sum(1<=n<=10),求1到n的数,如何排列之后,相邻两数相加,直到得出最后的结果等于sum,输出1到n的排列
示例输入: 4 16
示例输出:3 1 2 4
示例输出

02、解题思路

很明显,这道题只要列举出所有的情况就能得到答案,但是在列举所有情况的过程中我们可能需要一些处理来减少需要搜索的状态或者减低搜索所需的时间。看到题目中的从1到n的全排列的描述,我们想起,在C++的 < algorithm >库中有这样一个函数next_permutation(),它可以帮助我们生成一组数据的全排列(该函数的具体使用方法参见:next_permutation()

加上
爆搜
next_permutation
解决题目

03、题解代码

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

int n, sum;
int nums[20];
int temp[20];

int main() {
	while(cin >> n >> sum)	{
		for(int i = 1; i <= n; i++) 
			nums[i-1] = i;
	
		do {
			for(int i = 0; i < n-1; i++)
				temp[i] = nums[i]+nums[i+1]; 
			for(int i = 0; i < n-1; i++)
				for(int j = 0; j < n-2-i; j++)
					temp[j] = temp[j]+temp[j+1];
					
			if(temp[0] == sum)
				break;
		} while(next_permutation(nums, nums+n));
		
		for(int i = 0; i < n; i++)
			cout << nums[i] << " ";
		cout << endl; 
	}
		
	return 0;	
}

在不断学习的路上,让我们一起先更好的自己前进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值