0
点赞
收藏
分享

微信扫一扫

P2089 烤鸡

c一段旅程c 2022-03-18 阅读 27

题目背景

猪猪 Hanke 得到了一只鸡。

题目描述

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

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

输入格式

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

输出格式

第一行,方案总数。

第二行至结束,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 

说明/提示

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

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int tt=0;
void sth(int in,int n,int *p,int sum){
	if(in==10){
		if(sum==n){
			for(int i=0;i<10;i++){
				if(i)cout<<' ';
				else cout<<endl;
				cout<<p[i];
			}
		}	
		return;
	}
	for(int i=0;i<3;i++){
		if(i+sum<=n){
			int *x=(int*)malloc(sizeof(int)*10);
			for(int j=0;j<10;j++)x[j]=p[j];
			x[in]+=i;
			if(in<10)sth(in+1,n,x,sum+i);
		}
	}
}
void ct(int in,int n,int *p,int sum){
	if(in==10){
		if(sum==n)tt++;
		return;
	}
	for(int i=0;i<3;i++){
		if(i+sum<=n){
			int *x=(int*)malloc(sizeof(int)*10);
			for(int j=0;j<10;j++)x[j]=p[j];
			x[in]+=i;
			if(in<10)ct(in+1,n,x,sum+i);
		}
	}
}
int main(void){
    int n,p[10];
    cin>>n;
    if(n<10||n>30)cout<<0;
    else{
    	for(int i=0;i<10;i++)p[i]=1;
    	ct(0,n,p,10);
    	cout<<tt;
    	sth(0,n,p,10);
	}
	return 0; 
}
举报

相关推荐

0 条评论