(DFS)玄机宝物
作者:互联网
题目描述
世界上有正必有邪。由于一些魔教中人为了称霸世界,他们就联合了世界各地的魔教势力,形成了一个庞大的魔教联盟。而为了对抗这个魔教联盟,前不久成立了一个复仇者联盟。现在我们金华大陆为了扩大复仇者联盟的势力,决定派一些优秀弟子前往。
为了让这些优秀的弟子能在对抗魔头的时候获胜的几率更大些,我们金华大陆的各大门派的长老纷纷拿出了自己门派的玄级宝物,供这些优秀弟子使用。
这些玄级宝物可以容纳很多的符咒,但不能超过他的吸纳值范围。然而这些玄机宝物的数量却又是极其稀少。
这些玄级宝物所能收纳的最大能力值为W,一旦超过W玄级宝物里的符咒便会失效,所以我们不能让每件玄级宝物出现这种状况。现在这里有N件符咒,每件符咒的能量值为C1、C2……CN。
现在长老们想知道,最少需要几件玄机宝物才可以收纳完这些符咒?
输入格式:
第1行:包含两个用空格隔开的整数,N和W。第2..N+1行:每行一个整数,其中第i+1行的整数表示第i件符咒的能量值Ci。
输出格式:
输出一个整数,表示最少需要几件玄级宝物 输入样例复制5 1996 1 2 1994 12 29输出样例复制
2
说明
数据范围
1
1≤Ci≤W≤10的八次
代码
#include <cstdio>
#include <algorithm>
using namespace std;
bool comp(int a, int b);
void dfs(int u, int cnt); //当前第几件符咒 当前总吸收量
int n = 0; //n件宝物
int a[20]; //符咒
int sum[20]; //当前已装符咒总量
int res = 0; //宝物计数
int w = 0; //宝物的容纳和
int main(void)
{
scanf("%d %d", &n, &w);
res = n;
for (int i = 0; i < n; i++) //读入符咒
{
scanf("%d", &a[i]);
}
sort(a, a + n, comp);
dfs(0, 0);
printf("%d", res);
return 0;
}
void dfs(int u, int cnt)
{
if (cnt >= res) //如果当前总宝物 >= 现实存在的宝物,或者历史最优数值,返回
{
return;
}
if (u == n + 1) //如果搜索完了 n 件宝物,则更新答案
{
res = cnt;
return;
}
for (int i = 0; i < cnt; i++)
{
if (sum[i] + a[u] <= w) //检查容纳和是否还能吸
{
sum[i] += a[u];
dfs(u + 1, cnt);
sum[i] -= a[u];
}
}
sum[cnt] = a[u]; //新增一件宝物,容积为当前符咒
dfs(u + 1, cnt + 1);
sum[cnt] = 0;
}
bool comp(int a, int b)
{
return a > b;
}
标签:符咒,int,玄级,cnt,DFS,玄机,res,宝物 来源: https://blog.csdn.net/zzzxl_csdn/article/details/122027219