zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    jQuery Mobile-jquery Mobile 怎么用ajax提交表单
    Passing data between pages in JQuery Mobile | Ram's Blog
    jQuery Mobile Docs
    jquery mobile header title左对齐 button右对齐
    jquery mobile -role
    jQueryMobile$(document).ready 等价于?( jQuery mobi...
    HTML5,jQuery Mobile 可视化生成器 Tiggzi
    WebApi系列~开放的CORS,跨域资源访问对所有人开放
    WebApi系列~目录
    WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5735509.html
Copyright © 2011-2022 走看看