题解 | 小红的显存清理挑战

小红的显存清理挑战

https://www.nowcoder.com/practice/a7fe7d8f4ecb41c989588a075f5b8c68

写一个搜索加剪纸的做法

首先这是一个比较典型的背包DP

所以可以考虑有搜索来做,第一步是预处理,两种成本无脑选成本低的

再进一步预处理,把成本和空间做除法,形成每一个要不要考虑拿的性价比信息

在排序把性价比高的放在前面,优先拿高性价比的

后面就可以开始搜索了,考虑三个状态信息,其一,目前搜到第几层了,其二,已经释放多少空间了,其三,花费了多少成本

搜索过程中可以加一点剪纸优化,比如说如果我已经搜到结果了,如果新搜的状态成本比我高,空间还比我少,我就没必要继续搜下去了,之间return

代码思路比较简单如下了

#include<bits/stdc++.h>
using namespace std;

int n,m;
int mem[100005];
int cost1[100005],cost2[100005];
int tot;
int cst[100005];
struct node{
	int mem,cost1,cost2,cst;
	double xjb;
};
node a[100005];

bool cmp(node t1,node t2){return t1.xjb>t2.xjb;}
int ans=1000000007;
void dfs(int pos,int sz,int CST)
{
	if(pos==n+1)return;
	if(sz>=m)
	{
		ans=min(ans,CST);
		return;
	}
	if(CST>ans&&sz<m)return;
	dfs(pos+1,sz+a[pos].mem,CST+a[pos].cst);
	dfs(pos+1,sz,CST);
}

int main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
			cin>>a[i].mem;
		tot+=a[i].mem;
	}
	for(int i=1;i<=n;i++)
		cin>>a[i].cost1;
	for(int i=1;i<=n;i++)
		cin>>a[i].cost2;
	if(tot<m)
	{
		cout<<"error";
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		a[i].cst=min(a[i].cost1,a[i].cost2);
		a[i].xjb=double(a[i].mem)/double(a[i].cst);
	}
	sort(a+1,a+n+1,cmp);
	dfs(1,0,0);//DFS(考虑到了第几个张量,当前释放了多少空间,花费的成本有多少)
	cout<<ans;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务