对于100%的数据,V <= 200000 , N <= 200
1 // 混合背包板子 我的哥 全TLE~~~~~~~~
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 using namespace std;
6 #define N 210
7 #define V 200010
8 int n,v,f[V],wi[N],mi[N],vi[N];
9 int main()
10 {
11 scanf("%d%d",&n,&v);
12 for(int i=1;i<=n;i++)
13 {
14 scanf("%d%d%d",&vi[i],&wi[i],&mi[i]);
15 if(mi[i]==-1) mi[i]=v/vi[i];
16 }
17 for(int i=1;i<=n;i++)
18 {
19 for(int k=1;k<=mi[i];k++)
20 {
21 for(int j=v;j>=vi[i];j--)
22 f[j]=max(f[j],f[j-vi[i]]+wi[i]);
23 }
24 }
25 printf("%d",f[v]);
26 return 0;
27 }
AC代码:
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5 #define N 210
6 #define V 200010
7 int n,v,f[V],wi[N],mi[N],vi[N];
8 int main()
9 {
10 scanf("%d%d",&n,&v);
11 for(int i=1;i<=n;i++)
12 {
13 scanf("%d%d%d",&vi[i],&wi[i],&mi[i]);
14 if(mi[i]==-1) mi[i]=v/vi[i];
15 }
16 for(int i=1;i<=n;i++)
17 {
18 int x=mi[i];
19 for(int k=1;k<=x;k<<=1)//二分制优化
20 {
21 for (int j=v;j>=vi[i]*k;j--)
22 f[j]=max(f[j],f[j-vi[i]*k]+wi[i]*k);
23 x-=k;
24 }
25 if(x)
26 for (int j=v;j>=vi[i]*x;j--)
27 f[j]=max(f[j],f[j-vi[i]*x]+wi[i]*x);
28 }
29 printf("%d",f[v]);
30 return 0;
31 }
再次说明一点,我将可以去无数次的物品的次数换成了v/vi[i]次(即通过总背包体积来限制他,这样就可以省掉一步)。。。
二进制优化~~~依然的慢
待解救~~~~~~~
还有这题和队列有个毛关系~~