求助01背包问题
  • 板块学术版
  • 楼主LiJinLin_AFO
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/3/3 20:04
  • 上次更新2023/10/23 23:14:42
查看原帖
求助01背包问题
755503
LiJinLin_AFO楼主2023/3/3 20:04

题目(简略):01背包,事物重量为1或2,单个事物总量小于等于10的5次方,容量小于等于2 * 10的5次方,单个事物价值小于10000。求最大和。

rt,蒟蒻理解此题意,并可以正确写出代码(如下),不过时间复杂度太大了,面临超时的风险,请问哪儿可以优化?

(蒟蒻心理):递归可以改为递推,但是100%会超空间限制,一分也得不到......

#include<stdio.h>
#define max(x,y) ((x>y)?(x):(y))
int weight[100005],money[100005],n;
inline void in(int &x){
	x=0; bool f=0; char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c&15);
		c=getchar();
	}
	x=f?-x:x;
}
inline void out(int x){
	if(x<0) putchar('-'),x=-x;
	if(x/10) out(x/10);
	putchar((x%10)|48);
}
inline int f(int all,int ans,int i){
	if(all<0) return -2147483647;
	if(!all||i>n) return ans;
	return max(f(all,ans,i+1),f(all-weight[i],ans+money[i],i+1));
}
int main(){
	register int t;
	in(t);
	while(t--){
		register int all;
		in(n),in(all);
		for(int i=1;i<=n;i++) in(weight[i]),in(money[i]);
		out(f(all,0,1)),putchar('\n');
	}return 0;
}
2023/3/3 20:04
加载中...