求助,可不可以这样写?
  • 板块CF3B Lorry
  • 楼主456laji
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/10/22 22:42
  • 上次更新2023/11/5 10:08:21
查看原帖
求助,可不可以这样写?
312780
456laji楼主2020/10/22 22:42

先用DP算出最优的价值,再使用bfs寻找满足这个最优的价值和体积的编号,行吧?我这样写,应该是可以的吧? 求助,大佬们!

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
typedef long long ll;
int f[N],w[N],v[N];
string res;
int n,m;
struct node{
	string way;
	int index;
	int sum;
};

void bfs()
{
	queue<node> q;
	node t;
	t.way="";
	t.sum=0;
	t.index=0;
	q.push(t);
	
	while(!q.empty())
	{
		node now=q.front();
		q.pop();
		//printf("index=%d sum=%d \n",now.index,now.sum);
		//cout<<now.way<<endl<<endl;
		if(now.sum==f[m])
		{
			int len=now.way.length();
			int t_w=0;
			for(int i=0;i<len;i++)
				t_w+=w[now.way[i]-'0'];
			if(t_w<=m)
			{
				res=now.way;
				break;
			}
		}
		else
		{
			for(int i=1+now.index;i<=n;i++)
			{
				node temp=now;
				temp.way+=(i+'0');
				temp.sum=now.sum+v[i];
				temp.index=i;
				q.push(temp);
			}	
		}
	}
	
	int len=res.length();
	for(int i=0;i<len;i++)
		printf("%c ",res[i]);
	return ;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&w[i],&v[i]);
	
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=w[i];j--)
		{
			f[j]=max(f[j],f[j-w[i]]+v[i]);
		}
	}
	
	printf("%lld\n",f[m]);			
	bfs();
	return 0;
}
2020/10/22 22:42
加载中...