P2089 烤鸡

题目背景

猪猪 Hanke 得到了一只鸡。

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 种配料(芥末、孜然等),每种配料可以放 1 到 3 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 n ,请输出这 10 种配料的所有搭配方案。

输入格式

一个正整数 n,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,10 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 0。

输入输出样例

输入 

11

输出 

10
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1 

说明/提示

对于 100% 的数据,n≤5000。

代码

无注释版

#include
using namespace std;
int n;
int a[110],s[10010][110];
int cnt,sum;
void dfs(int x,int sum){
	if(x>10){
		if(sum==n){
			cnt++;
	        for(int i=1;i<=10;i++){
		        s[cnt][i]=a[i];
	        }
		}
	    return;
	}
	for(int i=1;i<=3;i++){
		a[x]=i;
		dfs(x+1,sum+i);
	}
	return;
} 
int main(){
	cin>>n;
	dfs(1,0);
	cout<

有注释版 

#include  // 包含标准库的所有头文件
using namespace std;    // 使用标准命名空间

int n;                  // 美味程度n
int a[110], s[10010][110]; // a数组存储当前配料组合,s数组存储所有有效的配料组合
int cnt, sum;           // cnt记录方案总数,sum记录当前配料质量总和

// 深度优先搜索函数,用于生成所有可能的配料组合
void dfs(int x, int sum) {
    if (x > 10) {       // 如果已经处理完10种配料
        if (sum == n) { // 如果当前配料质量总和等于美味程度n
            cnt++;      // 方案总数增加
            for (int i = 1; i <= 10; i++) {
                s[cnt][i] = a[i]; // 将当前配料组合存入s数组
            }
        }
        return;         // 返回上一层递归
    }
    for (int i = 1; i <= 3; i++) { // 每种配料可以放1到3克
        a[x] = i;       // 记录当前配料的克数
        dfs(x + 1, sum + i); // 递归处理下一种配料
    }
    return;             // 返回上一层递归
}

int main() {
    cin >> n;           // 输入美味程度n
    dfs(1, 0);          // 从第1种配料开始搜索,初始总和为0
    cout << cnt << "\n"; // 输出方案总数
    for (int i = 1; i <= cnt; i++) { // 遍历所有有效方案
        for (int j = 1; j <= 10; j++) { // 输出每种配料的克数
            cout << s[i][j] << " ";
        }
        cout << "\n";   // 换行
    }
    return 0;           // 程序正常结束
}

你可能感兴趣的:(洛谷,算法,深度优先,图论,数据结构,c++)