题目(简略):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;
}