poj 1020(回溯+dfs)
2021/8/3 6:07:35
本文主要是介绍poj 1020(回溯+dfs),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int d[11],n,s,visit[50]; bool dfs(int num){ int i,j,wide; if(num==n)return true; int pos; int minx = 100; for(j=1;j<=s;j++){ if(minx>visit[j]){ pos = j; minx = visit[j]; } } for(i=10;i>0;i--){ if(d[i]==0)continue; if(s-visit[pos]>=i&&pos+i-1<=s){ wide = 0; for(j=pos;j<pos+i;j++){ // if(visit[j]<=visit[pos]){ // wide++; // continue; // } // break; if(visit[j]>visit[pos])break; wide++; } if(wide==i){ d[i]--; for(j=pos;j<pos+i;j++) visit[j] += i; // for(j=1;j<=s;j++) // cout<<visit[j]<<" "; // cout<<endl<<num<<endl; if(dfs(num+1))return true; d[i]++; for(j=pos;j<pos+i;j++) visit[j] -= i; } } } return false; } int main(){ int t,i,tmp,count,sum; scanf("%d",&t); while(t--){ scanf("%d%d",&s,&n); memset(d,0,sizeof(d)); memset(visit,0,sizeof(visit)); count = 0; sum = 0; for(i=0;i<n;i++){ scanf("%d",&tmp); if(tmp>s/2)count++; d[tmp]++; sum += tmp*tmp; } if(count>1||s*s!=sum){ printf("HUTUTU!\n"); } // for(i=0;i<=10;i++) // cout<<d[i]<<endl; else if(dfs(0))printf("KHOOOOB!\n"); else printf("HUTUTU!\n"); } return 0; }
这篇关于poj 1020(回溯+dfs)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略