一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!
专栏:每日算法学习
个人主页:个人主页
算法分类:dfs练习
语言:java
题目来源:洛谷 P2089 烤鸡
猪猪 Hanke 得到了一只鸡。
猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10 10 10 种配料(芥末、孜然等),每种配料可以放 1 1 1 到 3 3 3 克,任意烤鸡的美味程度为所有配料质量之和。
现在, Hanke 想要知道,如果给你一个美味程度 n n n ,请输出这 10 10 10 种配料的所有搭配方案。
一个正整数 n n n,表示美味程度。
第一行,方案总数。
第二行至结束, 10 10 10 个数,表示每种配料所放的质量,按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个 0 0 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\% 100% 的数据, n ≤ 5000 n \leq 5000 n≤5000。
每种佐料有三种情况,所以总的情况不会超过3^10,我们枚举每一种情况,定义一个数组来每种方案内佐料的质量,定义一个sum来统计总重,作为回溯的条件,最后输出即可。
import java.util.Scanner;
public class Main {
//方案数
static int res;
//存储
static int count;
static int arr[];
static int hello[][] = new int [59050][11];
static int N;
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
N = s.nextInt();
arr = new int [20];
dfs(1,0);
System.out.println(res);
for(int i =1;i<=res;i++) {
for(int j =1;j<=10;j++) {
System.out.print(hello[i][j]+" ");
}
System.out.println();
}
}
public static void dfs(int index,int sum) {
if(sum>N) return;
if(index>10) {
if(sum ==N) {
res++;
for(int i=1;i<=10;i++) {
hello[res][i] = arr[i];
}
}
return ;
}
for(int i =1;i<=3;i++) {
arr[index] = i;
dfs(index+1, sum+i);
arr[index] =0;
}
}
}
感谢您的阅读,希望对您有所帮助。关注我,完成每日算法自律打卡,什么时候开始都不晚!!