hdu3448 01背包+dfs

本文介绍了一种针对01背包问题的优化解法,适用于物品数量较少但背包容量和重量限制较大的情况。通过使用搜索算法并结合特定的数据处理技巧,解决了传统方法中空间状态过大的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}

 

转载于:https://www.cnblogs.com/a-clown/p/6045234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值