请问该如何优化一个混合背包?
就是有01,有完全,有多重的那种。。。
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int n,m;
int v[150001],w[150001],p[150001];
int dp[10010];
int pre;
int t1,t2,t3,t=1;
int read(){
int r=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
r=r*10+ch-'0';
ch=getchar();
}
return r;
}
int main(){
memset(dp,0,sizeof(dp));
pre=0;
n=read();
m=read();
for(int i=1;i<=n;i++){
t1=read();
t2=read();
t3=read();
pre++;
if(t3==0){
t3=m/t1;
}
if(t3*t1>m){
t3=m/t1;
}
while(t3>=t){
v[pre]=t1*t;
w[pre]=t2*t;
t3-=t;
t*=2;
pre++;
}
pre++;
v[pre]=t1*t3;
w[pre]=t2*t3;
t=1;
}
for(int i=1;i<=pre;i++){
for(int j=m;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
printf("%d",dp[m]);
return 0;
}
RT
n,m小于等于10000
救救孩子吧。。。