【DFS】【最优化剪枝】竞赛真理

本文介绍了一种使用DFS(深度优先搜索)配合最优化剪枝策略解决竞赛中的一个问题,尽管正解可能是多重背包算法。由于问题规模较小,DFS在加入剪枝策略后也能有效通过。
摘要由CSDN通过智能技术生成

在这里插入图片描述

思路:

这题正解好像是多重背包
但是这n这么小貌似dfs也是可以的,加个最优化剪枝就过了


C o d e Code Code:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
double p[50];
int ans,n,m,v[50],q[50],h[50],g[50];
void dfs(int dep,int s,int t)//搜到当前dep所得分数剩余时长t
{
	if (dep > n)
	{
		if (s > ans) ans = s; //找到方案
		return;
	}
	if (t * p[dep] + s < ans) return; //最优化剪枝
	dfs(dep + 1, s, t);
	if (v[dep] <= t) dfs(dep + 1,s + q[dep],t - v[dep]); //搜
	if (h[dep] <= t) dfs(dep + 1,s + g[dep],t - h[dep]);
}

void px(){//排序,别问我为啥不用sort
	int i, j, t;
	double x; 
	for (i = 1;i <= n - 1; i++)
	for (j = i + 1; j <= n; j++)
	if (p[i] < p[j])
	{			
	        x = p[i]; p[i] = p[j]; p[j] = x;
			t = q[i]; q[i] = q[j]; q[j] = t;
			t = v[i]; v[i] = v[j]; v[j] = t;
			t = g[i]; g[i] = g[j]; g[j] = t;
			t = h[i]; h[i] = h[j]; h[j] = t;
	}
}
int main()
{
    double x;
	scanf("%d%d",&n, &m);
	for (int i = 1;i <= n;i++)
	{ 
	    scanf("%d%d%d%d", &q[i], &v[i], &g[i], &h[i]);
	    p[i] = (double)q[i] * 1.0 / v[i];//比值
		   x = (double)g[i] * 1.0 / h[i]; 
	    if (x > p[i]) p[i] = x; 
    }
px();//排序
	dfs(1, 0, m);//搜 
	printf("%d", ans);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值