⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4564568_ac_32ms_180k.cpp

📁 部分PKU上的源码
💻 CPP
字号:
#include <stdio.h> 
#include <stdlib.h>  //due to:qsort
#include <string.h>  

int n; 
int stick[100]; 
int total; 
int ns;            //一共需要还原出的木棍数ns
int ok;            
int len;           //当次需要达到的长度

int cmp(const void *a,const void *b) { 
   int a1 = *(int *)a; 
   int a2 = *(int *)b; 
   return a2 - a1; 
} 
int used[100]; 

int adds() { 
   int j = 0; 
   for (int i = 1;i <= n;i++) 
      j += stick[i]; 
   return j; 
} 

void search(int,int,int); 

void s(int x) {         //x 正在还原第x根木棍
   if (x > ns) { 
      ok = 1; 
      printf("%d\n", len); 
      return; 
   } 

   int i; 
   for (i = 1;i <= n;i++) 
      if (!used[i]) break;  //找到第一根没有使用的木棍

   used[i] = 1;           //改变它的使用状态
   search(x,stick[i],i);         //搜索
   used[i] = 0;                   //还原它的使用状态
} 

void search(int num,int now,int next) {   //num正在还原第num根木棍

   if (ok) return; 
   if (now == len) {   //一根木棍还原完
       s(num + 1);    //还原下一根
    return; 
   } 

   if (next + 1 > n) return;   //总共只有n根短棍

   for (int i = next + 1;i <= n;i++) 
      if (!used[i]) 
          if(stick[i] + now <= len) {   //该木棍加上当前长度小于len
         used[i] = 1;                    
         search(num,now + stick[i],i);   //搜索
         used[i] = 0; 
         if (ok) return; 
         if (stick[i] == len - now) return;  //有一根木棍长度正好等于当前差值
       } 
} 

int main () { 
   while (scanf("%d", &n) == 1) {               
       if (!n) break;                            //读数据
       ok = 0; 
        
    int i; 
    for (i = 1;i <= n;i++) scanf("%d", &stick[i]); 
    qsort(stick+1,n,sizeof(int),cmp);              //快速排序,从大到小
    total = adds();                                //计算木棍总长度
    for (i = stick[1];i <= total;i++)             //从最大的木棍 到 总长度 ,依次枚举 
        if (total % i == 0 && !ok) {              //如果该长度可以被总长度整除,且还没有ok
            ns = total / i;                       //求出一共需要还原出的木棍数ns
            memset(used,0,sizeof(used));          //所有木棍使用状态清零
            len = i;                              //当次需要达到的长度
            s(1);  
        } 
   } 
   return 0; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -