洛谷P1307 数字反转

ゝ一纸荒年。 2022-05-31 00:55 282阅读 0赞

题目背景

猪猪hanke得到了一只鸡

题目描述

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

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

输入输出格式

输入格式:

一行,n<=5000

输出格式:

第一行,方案总数

第二行至结束,10个数,表示每种配料所放的质量

按字典序排列。

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

输入输出样例

输入样例#1: 复制

  1. 11

输出样例#1: 复制

  1. 10
  2. 1 1 1 1 1 1 1 1 1 2
  3. 1 1 1 1 1 1 1 1 2 1
  4. 1 1 1 1 1 1 1 2 1 1
  5. 1 1 1 1 1 1 2 1 1 1
  6. 1 1 1 1 1 2 1 1 1 1
  7. 1 1 1 1 2 1 1 1 1 1
  8. 1 1 1 2 1 1 1 1 1 1
  9. 1 1 2 1 1 1 1 1 1 1
  10. 1 2 1 1 1 1 1 1 1 1
  11. 2 1 1 1 1 1 1 1 1 1

说明

枚举

直接贴代码,注释很详细

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. int n;
  6. int ans[10001][10];
  7. int tmp[10];
  8. int sum;
  9. void dfs(int step, int all) //step表示当前是第几中调料,all表示当前的总调料量
  10. {
  11. if (step == 10) //到了第10中就开始判断
  12. {
  13. if (all == n) //如果当前总调料量等于预定的n
  14. {
  15. int flag = 0; //flag=0表示10种调料里没有质量为0的,反之则有质量为0的
  16. for (int i = 0; i < 10; i++)
  17. {
  18. if (tmp[i] != 0)
  19. {
  20. ans[sum][i] = tmp[i];
  21. }
  22. else
  23. {
  24. flag = 1;
  25. break;
  26. }
  27. }
  28. if (!flag)
  29. sum++; //没有质量为0的调料就方案数加1
  30. }
  31. return;
  32. }
  33. else
  34. {
  35. for (int j = 1; j <= 3; j++)//每种调料的三种重量
  36. {
  37. if (all + j > n) break; //如果此时大于预定的调料,就退出不勇计算后面的调料
  38. all += j; //总调料量加上当前这种调料的质量
  39. tmp[step] = j; //记录
  40. dfs(step + 1, all); //接着下一种调料计算
  41. tmp[step] = 0; //置为零,表示这种调料尝试过了这种情况然后去掉
  42. all -= j; //相应的总调料量减去当前这种的调料的量
  43. }
  44. }
  45. }
  46. int main()
  47. {
  48. cin >> n;
  49. dfs(0, 0);
  50. if (!sum)
  51. cout << 0;
  52. else
  53. {
  54. cout << sum;
  55. cout << '\n';
  56. for (int i = 0; i < sum; i++)
  57. {
  58. for (int j = 0; j < 10; j++)
  59. {
  60. cout << ans[i][j] << ' ';
  61. }
  62. cout << '\n';
  63. }
  64. }
  65. return 0;
  66. }

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读

    相关 P1216数字三角形

    题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7