hdu 3448 Bag Problem dfs求背包问题

该博客介绍了一种使用深度优先搜索(DFS)解决背包问题的方法。代码中,作者通过DFS遍历所有可能的物品组合,以找到最大价值。在处理过程中,注意到数组命名的细节对程序运行结果的影响。程序读取物品数量、背包容量及每个物品的重量,然后对物品重量进行排序,最后应用DFS找出最大总重量。
摘要由CSDN通过智能技术生成
Problem 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

 

 //

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,k;
int wi[60];//用C++交,定义成w数组就wrong,wi数组就AC  不解释了
int cnt;
void dfs(int id,int num,int weight)
{
    cnt=max(cnt,weight);
    if(id==k) return ;
    dfs(id+1,num,weight);
    if(weight+wi[id]<=m&&num+1<=n) dfs(id+1,num+1,weight+wi[id]);
}
int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        scanf("%d",&k);
        int tsum;
        for(int i=0;i<k;i++)
        {
            scanf("%d",&wi[i]);
        }
        sort(wi,wi+k);
        tsum=0;
        for(int i=k-1;i>=k-n;i--) tsum+=wi[i];
        if(wi[0]>m) tsum=0;
        if(tsum<=m)
        {
            printf("%d\n",tsum);
            continue;
        }
        cnt=0;
        dfs(0,0,0);
        printf("%d\n",cnt);
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值