hdu3448 01背包+dfs

Posted a_clown_cz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu3448 01背包+dfs相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3448

Description

0/1 bag problem should sound familiar to everybody. Every earth man knows it well. Here is a mutant: given the capacity of a bag, that is to say, the number of goods the bag can carry (has nothing to do with the volume of the goods), and the weight it can carry. Given the weight of all goods, write a program that can output, under the limit in the above statements, the highest weight. 

Input

Input will consist of multiple test cases The first line will contain two integers n (n<=40) and m, indicating the number of goods and the weight it can carry. Then follows a number k, indicating the number of goods, k <=40. Then k line follows, indicating the weight of each goods The parameters that haven’t been mentioned specifically fall into the range of 1 to 1000000000. 

Output

For each test case, you should output a single number indicating the highest weight that can be put in the bag. 

Sample Input

5 100
8
8 64 17 23 91 32 17 12
5 10
3
99 99 99

Sample Output

99
0

 

 

01背包,但是整个空间状态太大,开不了那么大是数组,就算能开那么大的数组也会超时。

二题目中的物品件数又比较少,所以我们可以用搜索写。

//还是写的题目太少了,见的也太少了,遇到这样的题目根本想不到用搜索。anyway加油吧!

 

代码:

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,m,k,ans;
int a[45];

void dfs(int t,int i,int x)
{
    ans=max(ans,x);
    if(i>k) return;
    if(t+1<=n && x+a[i]<=m)
    dfs(t+1,i+1,x+a[i]);
    dfs(t,i+1,x);
}

bool cmp(int a,int b){return a>b;}

int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        scanf("%d",&k);
        memset(a,0,sizeof(a));
        for(int i=1; i<=k; i++)scanf("%d",&a[i]);
        sort(a+1,a+1+k,cmp);
        int sum=0;
        for(int i=1;i<=n;i++)sum+=a[i];
        if(m>=sum){printf("%d\n",sum);continue;}
        ans=0;
        dfs(0,1,0);   ///0---n,1---数组脚标,0---ans;
        printf("%d\n",ans);
    }
    return 0;
}

 

以上是关于hdu3448 01背包+dfs的主要内容,如果未能解决你的问题,请参考以下文章

(01背包)HDU - 2126 Buy the souvenirs

会超时的dfs01背包+快一点的一维DP01背包

HDU 2546 01背包

hdu 2602 dp 01背包

HDU 1171 Big Event in HDU(01背包)

hdu 2546 饭卡 (01背包)