ZOJ3158 【DFS】

题意:

从上往下切割,不能切边缘,然后问你两个差值,要小于给出的值。

思路:

直接爆搜,枚举每一行的劈开位置;

#include<bits/stdc++.h>
using namespace std;

const int N=1e2+10;
const int INF=0x3f3f3f3f;

int n,m;
int sum[N][N];
int ssum,ans;

void DFS(int num,int summ)
{
    int temp;
    for(int i=1;i<m;i++)
    {
        temp=summ+sum[num][i];
        if(num==n)
        {
            ans=min(ans,abs(temp-ssum+temp));
        }
        else
            DFS(num+1,temp);
    }
}

int main()
{
    int flag;
    while(~scanf("%d%d",&n,&m))
    {
        int dd;
        memset(sum,0,sizeof(sum));
        ssum=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&dd);
                ssum+=dd;
                sum[i][j]=sum[i][j-1]+dd;
            }
        }
        scanf("%d",&flag);
        ans=INF;
        DFS(1,0);
        if(ans>flag)
            puts("You'd better buy another one!");
        else
            printf("%d\n",ans);
    }
    return 0;
}


posted @ 2017-01-17 16:49  see_you_later  阅读(137)  评论(0编辑  收藏  举报