洛谷P1307 数字反转
题目背景
猪猪hanke得到了一只鸡
题目描述
猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和
现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案
输入输出格式
输入格式:
一行,n<=5000
输出格式:
第一行,方案总数
第二行至结束,10个数,表示每种配料所放的质量
按字典序排列。
如果没有符合要求的方法,就只要在第一行输出一个“0”
输入输出样例
输入样例#1: 复制
11
输出样例#1: 复制
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
说明
枚举
直接贴代码,注释很详细
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int n;
int ans[10001][10];
int tmp[10];
int sum;
void dfs(int step, int all) //step表示当前是第几中调料,all表示当前的总调料量
{
if (step == 10) //到了第10中就开始判断
{
if (all == n) //如果当前总调料量等于预定的n
{
int flag = 0; //flag=0表示10种调料里没有质量为0的,反之则有质量为0的
for (int i = 0; i < 10; i++)
{
if (tmp[i] != 0)
{
ans[sum][i] = tmp[i];
}
else
{
flag = 1;
break;
}
}
if (!flag)
sum++; //没有质量为0的调料就方案数加1
}
return;
}
else
{
for (int j = 1; j <= 3; j++)//每种调料的三种重量
{
if (all + j > n) break; //如果此时大于预定的调料,就退出不勇计算后面的调料
all += j; //总调料量加上当前这种调料的质量
tmp[step] = j; //记录
dfs(step + 1, all); //接着下一种调料计算
tmp[step] = 0; //置为零,表示这种调料尝试过了这种情况然后去掉
all -= j; //相应的总调料量减去当前这种的调料的量
}
}
}
int main()
{
cin >> n;
dfs(0, 0);
if (!sum)
cout << 0;
else
{
cout << sum;
cout << '\n';
for (int i = 0; i < sum; i++)
{
for (int j = 0; j < 10; j++)
{
cout << ans[i][j] << ' ';
}
cout << '\n';
}
}
return 0;
}
还没有评论,来说两句吧...