hdu 1445 dfs剪枝

题意比较简单;重点在剪枝上。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;

int n,num[70],mark[70],k,flash;
int dfs(int s,int ii,int t,int c)
{
    if(t==c)
    {
        flash=1;
        return 1;
    }
    if(flash) return 0;
    if(s==k)
    {
        dfs(0,1,t+1,c);
        //return 1;
    }
    else
    {
        int i;
        for(i=ii;i<=n;i++)
        {
            if(s+num[i]>k) continue;
            if(mark[i]) continue;
            mark[i]=1;
            dfs(s+num[i],i+1,t,c);
            mark[i]=0;
            if(s==0) return 0;//如果当前是第一个木棍但是没有用上 很明显不能存在答案  在时间上是个大优化
            while(num[i+1]==num[i]) i++;//当前这个数没用上则与他相等的也用不上

            if(flash) return 0;
        }
    }
    return 0;
}
int cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int i,j;
    while(~scanf("%d",&n),n)
    {
        int Max=0,sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
            sum+=num[i];
            if(Max<num[i]) Max=num[i];
        }
        //printf("%d\n",sum);
        sort(num+1,num+1+n,cmp);
        flash=0;
        for(i=n;i>=1;i--)
        {
            if(sum%i!=0) continue;
            k=sum/i;
            //printf("%d \n",i);
            if(k<Max) continue;
            memset(mark,0,sizeof(mark));
            dfs(0,1,0,i);
            if(flash) break;
        }
        printf("%d\n",k);
    }
    return 0;
}
时间: 2024-10-10 06:57:28

hdu 1445 dfs剪枝的相关文章

hdu 4109 dfs+剪枝优化

求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己增加的)出发,0到1~n个节点之间的距离为1,mt[i]表示从0点到第i个节点目前所得的最长路径 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; const

hdu 1584 dfs+剪枝

蜘蛛牌 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3730    Accepted Submission(s): 1591 Problem Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也

hdu 1728 DFS+剪枝 逃离迷宫

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 typedef struct Node 6 { 7 int x, y; 8 }Node; 9 10 const int MAX = 10000; 11 const int N = 110; 12 const int dir[4][2] = { {-1,0}, {0,1}, {1,0}, {0,-1} };//移动方向 13 bool

hdu 1010 dfs+剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 119601 Accepted Submission(s): 32313 Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot.

HDU 5113 dfs剪枝

题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31ms过.剪枝看代码. 1 #include <cstdio> 2 #include <iostream> 3 #include <sstream> 4 #include <cmath> 5 #include <cstring> 6 #include &

hdu 5305 dfs+剪枝

思路:对每一条边涂上颜色1或-1,颜色值加到关联的两个点上,则一种成功的方案必须满足最后每个点的值为0. 剪枝:统计出和某个点i相关联的边的个数,如果枚举到某一条边的时候发现:abs(sum[i]) > degree[i],则剪去,其中sun[i]表示i点的值,degree[i]表示剩下的还没有枚举的和i关联的边的个数. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using n

hdu 1518 dfs+剪枝

题目大意:几根棒子能否组成一个正方形 Sample Input3           //测试组数4 1 1 1 1   //棒子数目以及每根棒子的长度5 10 20 30 40 508 1 7 2 6 4 4 3 5 Sample Output yesnoyes 虽然不用pos直接从0开始枚举也可以有答案,但会超时,加个pos,以前dfs过的情况就不会再出现了,想起以前bc的一道题也是这样 1 #include<cstdio> 2 #include<iostream> 3 #in

HDU 1010 Tempter of the Bone dfs+剪枝

给你一个迷宫一个起点和一个终点,问你能否走T步刚好到达终点,不能重复走,并且只有4个方向 显然这是一个dfs,虽然N最大只有7,但是裸的dfs复杂度还是太高了,因此要进行一些剪枝 1.如果T比图上所有的可走点还要大,肯定是不可行的.这个可以避免dfs整张图. 2.奇偶剪枝,有性质当前点(x,y)到目标点(tx,ty)的所有路径的长度的奇偶性一定和|x-tx|+|y-ty|一样. #include <cstdio> #include <iostream> #include <c

hdu 1010 Tempter of the Bone (DFS+剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 68206    Accepted Submission(s): 18719 Problem Description The doggie found a bone in an ancient maze, which fascinated him a