Bookshelf 2 poj3628(01背包/DFS)

http://poj.org/problem?id=3628

题意:现有一个书架,N头牛,农场主想把这些牛放在书架上,当然,书架是有固定的高度的。现在问你在这些牛之中,其中一些牛的高度加在一块比书架高的最小差值是多少?

分析:

两种方法:(1)01背包,算得所有牛的高度,然后dp一遍,再找比书架高的最小值,两数相减即可。

          (2)DFS,DFS(牛的坐标, 牛高度的总和),若在DFS过程中,牛高度的总和>=书架高度,则可以求我们所需要的值

01背包:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include <iostream>
#include<algorithm>
#include<queue>
#define maxn 1100
#define oo 0x3f3f3f3f
using namespace std;
int dp[maxn*maxn], w[maxn];

int main()
{
    int n, m;

    while(scanf("%d %d", &n, &m)!=EOF)
    {
        int sum = 0;

        for(int i=1; i<=n; i++)
        {
               scanf("%d", &w[i]);
               sum += w[i];
        }


        memset(dp, 0, sizeof(dp));

        for(int i=1; i<=n; i++)
        {
            for(int j=sum; j>=w[i]; j--)
            {
                dp[j]=max(dp[j], dp[j-w[i]]+w[i]);
            }
        }
        int mins = oo;

       for(int i=1; i<=sum; i++)
       {
           if(dp[i]>=m)
           {
               mins=min(mins, dp[i]-m);
           }
       }

       printf("%d
", mins);
    }
    return 0;
}
View Code

DFS:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include <iostream>
#include<algorithm>
#include<queue>
#define maxn 1100
#define oo 0x3f3f3f3f
using namespace std;
int a[maxn], v[maxn];
int n, m, mins;

void DFS(int x, int sum)
{
    if(sum >= m)
    {
        mins=min(mins, sum-m);
        return ;
    }

    if(x>n || mins==0) return ;

    for(int i=x; i<=n; i++)
    {
        if(!v[i])
        {
            v[i] = 1;
            DFS(i+1, sum+a[i]);
            v[i] = 0;
        }
    }


}


int main()
{
    while(scanf("%d %d", &n, &m)!=EOF)
    {
        for(int i=1; i<=n; i++)
            scanf("%d", &a[i]);

        memset(v, 0, sizeof(v));
            mins = oo;

         DFS(1, 0);

         printf("%d
", mins);
    }
    return 0;
}
View Code

 

原文地址:https://www.cnblogs.com/daydayupacm/p/5735509.html