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

C++用穷竭搜索解POJ3187

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

C++用穷竭搜索解POJ3187

POJ3187 Backward Digit Sums

题目链接:
POJ3187 Backward Digit Sums

简单理解一下题目:
给1-N的数列,类似于杨辉三角,两两相加得到新的数列,每一次加完数字个数就减少一个,但是和会增加,问这N个数字使得和为给定的sum的最小字典序排列。

简单分析一下题目:
这道题就是简单的暴力搜索,跟我上一篇博客那道POJ2718的问题用的方法也一样,就是用next_permutation()全排列,由于这个函数是按照字典序来排列的,就可以很方便地解决题目需要的最小字典序排列问题。

AC代码:

#include
#include

using namespace std;

const int MAX_N = 12;

int N;
int res;
int a[MAX_N];
int b[MAX_N];
int c[MAX_N];

int compute() {
	int temp = N - 1;
	for (int i = 0; i < N; i++) {
		c[i] = a[i];
	}
	while (temp) {
		for (int i = 0; i < temp; i++) {
			b[i] = c[i] + c[i + 1];
		}
		c[temp] = 0;
		for (int i = 0; i < temp; i++) {
			c[i] = b[i];
		}
		temp--;
	}
	return c[0];
}

void solve() {
	do {
		if (compute() == res) {
			for (int i = 0; i < N; i++) {
				cout << a[i] << " ";
			}
			break;
		}
	} while (next_permutation(a, a + N));
	return;
}

int main() {
	cin >> N >> res;
	for (int i = 0; i < N; i++) {
		a[i] = i + 1;
	}
	solve();
	return 0;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869177.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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