10背包完全背包多重背包混合模板

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[1010],t[1010],w[1010];
 5 int dp[200010];
 6 struct node
 7 {
 8     int l,r,value;
 9 }num[100010];
10 int cmp(node x,node y)
11 {
12     if(x.l == y.l)
13         return x.r<y.r;
14     return x.l<y.l;
15 }
16 int vis[100010];
17 int main()
18 {
19     int T;
20     scanf("%d%d",&n,&T);
21     for(int i = 1; i <= n; i++)
22     {
23         scanf("%d%d%d",&t[i],&a[i],&w[i]);
24         if(w[i]==-1)
25             vis[i] = -1;
26         if(w[i]==1)
27             vis[i] = 1;
28     }
29     for(int i = 1; i<= n; i++)
30     {
31         if(vis[i] == -1)
32         {
33             for(int j = t[i]; j <= T; j++)
34             {
35                 dp[j] = max(dp[j],dp[j-t[i]]+a[i]);
36             }
37         }
38         else
39         {
40             int x = w[i],k;
41             for(k = 1;k <= x; k<<=1)
42             {
43                 for(int j = T; j >= k*t[i]; j--)
44                     dp[j] = max(dp[j],dp[j-k*t[i]]+k*a[i]);
45                 x-=k;
46             }
47             if(x!=0)
48             {
49                 for(int j = T; j >= x*t[i]; j--)
50                 {
51                     dp[j] = max(dp[j],dp[j-x*t[i]]+x*a[i]);
52                 }
53             }
54         }
55     }
56     cout<<dp[T]<<endl;
57     return 0;
58 }
原文地址:https://www.cnblogs.com/--lr/p/9438986.html