码迷,mamicode.com
首页 > 其他好文 > 详细

(综合)P2089 烤鸡

时间:2020-01-30 21:03:17      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:结果   数组   main   复杂度   turn   params   完成   tle   二维   

题解:

 

#include<stdio.h>
int n,ret=0,a[10000][10];
int p(int c,int s){
 int i;
 for(i=1;i<=3;i++){
   s+=i;
   if(c==9){
     if(s==n){
       a[ret][c]=i;
       ret++;
       return 1;
     }else{
      s-=i;
       continue;
     }
   }else{
     if(p(c+1,s)){
      a[ret-1][c]=i;
      return 1;
    }
  }
 
 }
}
int main()
{
 int i,j;
 scanf("%d",&n);
 if(n>30&&n<10){
  printf("0");
 }else{
  int b=p(0,0);
 
 }
 printf("%d\n",ret);
 for(i=0;i<ret;i++){
  for(j=0;j<10;j++){
   printf("%d ",a[i][j]);
  }
  printf("\n");
 }
 return 0;
}
 
可惜的是这个递归出来只有一个解,之后将返回值去掉,进入函数时存放数据,满足一次就拷贝数据至下一行数组中,继续循环。这样弄有点繁琐。
简单点的话,其实可以用一个一维数组来测试组合,符合时就将这组数拷贝到二维数组中。
m1[10000][10],m2[10];
 
void p(int total,int a){
    if (a==10){
        if (total==n) {
            for (int j=0;j<10;j++) m1[kind][j]=m2[j];//符合要求存起来~~
            kind++;
        }
    }
    else if (total>=n) ;//小小优化一下
    else
      for (int i=1;i<=3;i++){
          m2[a]=i;
          peiliao(total+i,a+1);//其实这和十连for没什么区别。。。
      }
}
 
网上说正解是搜索,歪解是枚举,枚举两遍即可完成,说实话咱也想过要枚举,一是觉得有点简单,二是觉得可能会算法复杂度太高,结果是不高。。。

(综合)P2089 烤鸡

标签:结果   数组   main   复杂度   turn   params   完成   tle   二维   

原文地址:https://www.cnblogs.com/lijiahui-123/p/12243524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!