HDU 3448 Bag Problem

时间:2022-11-04 17:41:25

这是一道搜索的背包题目

题意:

有n件物品从中最多选m件,使其总重量不超过v,求能获得的最大重量

有一个很重要的剪枝(是数据的问题还是这个剪枝本身很高效?):

如果重量最大m件物品都不超过v,则答案就是该m件物品之和;或者最轻的物品的重量大于v则答案为0

中间TLE了几次,又WA了几次,好辛苦啊,Orz

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long LL;
LL ans, n, m, v, a[];
bool vis[]; void DFS(LL x, LL cnt, LL w)
{
if(x > n || cnt > m) return;
if(w > ans) ans = w;
for(int i = x + ; i <= n; ++i)
{
if(!vis[i] && a[i] + w <= v)
{
vis[i] = true;
DFS(x + , cnt + , w + a[i]);
vis[i] = false;
}
}
} int main(void)
{
#ifdef LOCAL
freopen("3448in.txt", "r", stdin);
#endif while(scanf("%lld%lld", &m, &v) == )
{
scanf("%lld", &n);
ans = ;
for(int i = ; i <= n; ++i) scanf("%lld", &a[i]); //剪枝
sort(a + , a + + n);
for(int i = n; i > n - m; --i)
ans += a[i];
if(a[] > v) ans = ;
if(ans <= v)
{
printf("%lld\n", ans);
continue;
} ans = ;
memset(vis, false, sizeof(vis));
DFS(, , );
printf("%d\n", ans);
}
return ;
}

代码君