悬赏关注,多重背包的二进制拆分优化, 大佬救救我吧
  • 板块学术版
  • 楼主zhaoxubing
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/3/28 10:48
  • 上次更新2023/10/23 20:15:44
查看原帖
悬赏关注,多重背包的二进制拆分优化, 大佬救救我吧
908394
zhaoxubing楼主2023/3/28 10:48

我用二进制优化+二维的01背包来写,在acwing上面的那道多重背包模板题样例都过不了,下面是二维01背包的代码

#include<iostream>
#include<cmath>
using namespace std;
int f[10000][20000],sb[12100],cb[12100],wb[12100];
int n,v,cnt,s,c,w;
int main()
{
	cin>>n>>v;
	for(int i=1;i<=n;i++){
		cin>>c>>w>>s;
		int k=1;
		while(k<=s)
		{
			cnt++;
			cb[cnt]=k*c,wb[cnt]=k*w;
			s-=k;
			k*=2;			
		}
		if(s>0){
			cnt++;
			cb[cnt]=c*s,wb[cnt]=w*s;
		}
	}
	n=cnt;
	for(int i=1;i<=n;i++)
		for(int j=v;j>=cb[i];j--)
			f[i][j]=max(f[i-1][j],f[i-1][j-cb[i]]+wb[i]);
	cout<<f[n][v]<<endl;
	return 0;
 }

但是将二维01背包压缩成一维之后就AC了,我十分不理解,希望有大佬能帮帮我,下面是代码

#include<iostream>
#include<cmath>
using namespace std;
int f[21000],sb[12100],cb[12100],wb[12100];
int n,v,cnt,s,c,w;
int main()
{
   cin>>n>>v;
   for(int i=1;i<=n;i++){
   	cin>>c>>w>>s;
   	int k=1;
   	while(k<=s)
   	{
   		cnt++;
   		cb[cnt]=k*c,wb[cnt]=k*w;
   		s-=k;
   		k*=2;			
   	}
   	if(s>0){
   		cnt++;
   		cb[cnt]=c*s,wb[cnt]=w*s;
   	}
   }
   n=cnt;
   for(int i=1;i<=n;i++)
   	for(int j=v;j>=cb[i];j--)
   		f[j]=max(f[j],f[j-cb[i]]+wb[i]);
   cout<<f[v]<<endl;
   return 0;
} 

如果有大佬帮到我了,我会成为您的一枚粉丝

2023/3/28 10:48
加载中...