http://acm.hdu.edu.cn/showproblem.php?pid=1518
分析:所有木棒都要用到,刚开始完全没有领会到这个真谛
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=25;
int a[NM],n,temp;
bool vis[NM],flag;
void DFS(int res,int ans,int k)
{
if(flag) return; //重要的剪枝
if(res==temp){
ans++;
res=k=0;
}
if(ans==4){
flag=true;return;
}
//k
for(int i=k;i<n;i++){
if(!vis[i] && res+a[i]<=temp){
vis[i]=1;
DFS(res+a[i],ans,i+1);
vis[i]=0;
}
}
}
int main()
{
int T,i,sum;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum=0;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
if(sum%4!=0) {
printf("no\n");continue;
}
temp=sum/4;
for(i=0;i<n;i++){
if(a[i]>temp) {
printf("no\n");continue;
}
}
flag=false;
memset(vis,0,sizeof(vis));
DFS(0,0,0);
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}

本文分析了 HDU 1518 题目,并提供了一个 C++ 实现的解决方案。该问题要求将若干长度不一的木棒分割成四组,每组总长度相等。通过递归深度优先搜索 (DFS) 方法进行遍历验证所有可能的组合。
623

被折叠的 条评论
为什么被折叠?



