洛谷 p2089 烤鸡 java(暴力枚举)

题目背景

猪猪 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%100% 的数据,n≤5000。

问题理解:

问题的核心是要找出所有可能的配料组合,使得这些配料的总量达到给定的美味程度。每种配料都有三种不同的添加方式(1克,2克,3克),需要找出所有满足条件的配料组合。

代码示例: 

package luogu;

import java.util.Scanner;

public class P2089 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = 0;
        for (int i = 1; i <= 3 ; i++) {
            for (int j = 1; j <= 3 ; j++) {
                for (int k = 1; k <= 3; k++) {
                    for (int l = 1; l <= 3 ; l++) {
                        for (int m = 1; m <=3; m++) {
                            for (int o = 1; o <= 3 ; o++) {
                                for (int p = 1; p <= 3 ; p++) {
                                    for (int q = 1; q <= 3 ; q++) {
                                        for (int r = 1; r <= 3 ; r++) {
                                            for (int s = 1; s <= 3 ; s++) {
                                                if (i + j + k + l + m + o + p + q + r + s == n){
                                                    count++;
                                                }

                                            }

                                        }

                                    }

                                }

                            }

                        }

                    }

                }

            }

        }
        System.out.println(count);
        for (int i = 1; i <= 3 ; i++) {
            for (int j = 1; j <= 3 ; j++) {
                for (int k = 1; k <= 3; k++) {
                    for (int l = 1; l <= 3 ; l++) {
                        for (int m = 1; m <= 3; m++) {
                            for (int o = 1; o <= 3 ; o++) {
                                for (int p = 1; p <= 3 ; p++) {
                                    for (int q = 1; q <= 3 ; q++) {
                                        for (int r = 1; r <= 3 ; r++) {
                                            for (int s = 1; s <= 3 ; s++) {
                                                if (i + j + k + l + m + o + p + q + r + s == n){
                                                    System.out.println(i + " " +j+ " " + k + " "+ l + " "+ m + " "+ o + " "+ p + " "+ q + " "+ r + " "+ s);
                                                }

                                            }

                                        }

                                    }

                                }

                            }

                        }

                    }

                }

            }

        }

    }
}

 注: 十层循环对所有可能的解决方案进行逐一尝试,直到找到满足条件的解。虽然繁           琐,但是很容易理解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值