欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷p2089

程序员文章站 2022-06-08 14:07:57
...

洛谷p2089

毫无疑问,又是一个dfs,不过这次要求将方案先输出,最后再输出方案个数,那我就要找个东西存我的方案,由于是10位的,且开始可能为3,那么就没办法用int数组来存了,我的话做了字符数组来存,由于3的10次方是5900多,即有5900多种搭配,所以我初始化了一个大小为100000的char数组,上代码。

#include <iostream>
#include <string>

using namespace std;

int ans[11] = { 0 };
int ways = 0;
char way[100000] = {0};

void dfs(int count,int leftSpice ) {//记录现在是第几个瓶子,还有余下多少香料
	if (count == 10) {//当第十个瓶,将余下的香料放进瓶子里,结束
		ans[count] = leftSpice;
		for (int i = 0; i < 10; i++)
		{
			way[10 * ways + i] = ans[i+1];
		}
		ways++;
		return;
	}
	for (int i = 1; i <= 3; i++)
	{
		if (leftSpice-i < 10 - count) {//投入香料后,后面的的连每样1克都不够,剪枝
			break;
		}
		if (leftSpice - i > (10 - count) * 3) {//投入香料后,后面每样3克还有多的,剪枝
			continue;
		}
		ans[count] = i;//记录投放的克数。
		dfs(count + 1, leftSpice - i);
	}

}

int main() {
	
	int n;//输入美味程度
	cin >> n;
	if (n < 10 || n>30) {
		cout << 0 << endl;
		return 0;
	}
	dfs(1, n);
	cout << ways << endl;
	int j = 0;
	while (ways--) {
		for (int i = 0+j; i < 10+j; i++) {
			cout << (int)way[i] << " ";
		}
		cout << endl;
		j += 10;
	}
	return 0;
}

有疑问,欢迎评论问我!告辞!

相关标签: 算法