luogu1064金明的预算方案

题面太长

手残把n打成m

 1 void read()
 2 {
 3     red(n);
 4     red(m);
 5     memset(v,0x3f,sizeof(v));
 6     for(int i=1;i<=m;++i)
 7     {
 8         red(x);
 9         red(p);
10         red(q);
11         if(q)
12         {
13             v[q][i]=x;
14             w[q][i]=x*p;
15         }        
16         else
17         {
18             v[i][0]=x;
19             w[i][0]=x*p;
20         }    
21     }    
22 }
23 void work()
24 {
25     for(int i=1;i<=m;++i)
26         for(int j=n;j>=v[i][0];--j)
27         {
28             if(f[j-v[i][0]]+w[i][0]>f[j])
29             {
30                 f[j]=f[j-v[i][0]]+w[i][0];
31                 for(int k=1;k<=m;++k)
32                     if(j+v[i][k]<=m)
33                         f[j+v[i][k]]=max(f[j+v[i][k]],f[j]+w[i][k]);
34             }
35         }
36     for(int i=1;i<=n;++i)
37         ans=max(ans,f[i]);
38     printf("%d",ans);
39 }
很瓜的20分
 1 void read()
 2 {
 3     red(n);
 4     red(m);
 5     memset(v,0x3f,sizeof(v));
 6     for(int i=1;i<=m;++i)
 7     {
 8         red(x);
 9         red(p);
10         red(q);
11         if(q)
12         {
13             v[q][i]=x;
14             w[q][i]=x*p;
15         }        
16         else
17         {
18             v[i][0]=x;
19             w[i][0]=x*p;
20         }    
21     }    
22 }
23 void work()
24 {
25     for(int i=1;i<=m;++i)
26         for(int j=n;j>=v[i][0];--j)
27         {
28             if(!v[i][0])
29                 break;
30             if(f[j-v[i][0]]+w[i][0]>f[j])
31             {
32                 f[j]=f[j-v[i][0]]+w[i][0];
33                 for(int k=1;k<=m;++k)
34                     if(j+v[i][k]<=n)
35                         f[j+v[i][k]]=max(f[j+v[i][k]],f[j]+w[i][k]);
36             }
37         }
38     for(int i=0;i<=n;++i)
39         ans=max(ans,f[i]);
40     printf("%d",ans);
41 }
更瓜的40分(改成了n)

这个时候才注意到附件是0-2个

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+5;
 4 const int INF=1e9+7;
 5 int n,m,x,p,q,v[65][65],w[65][65],f[maxn],ans,t[65];
 6 template <class t>void red(t &x)
 7 {
 8     x=0;
 9     int w=1;
10     char ch=getchar();
11     while(ch<'0'||ch>'9')
12     {
13         if(ch=='-')
14             w=-1;
15         ch=getchar();
16     }
17     while(ch>='0'&&ch<='9')
18     {
19         x=(x<<3)+(x<<1)+ch-'0';
20         ch=getchar();
21     }
22     x*=w;
23 }
24 void input()
25 {
26     freopen("input.txt","r",stdin);
27 }
28 void read()
29 {
30     red(n);
31     red(m);
32     memset(v,0x3f,sizeof(v));
33     for(int i=1;i<=m;++i)
34     {
35         red(x);
36         red(p);
37         red(q);
38         if(q)
39         {
40             v[q][++t[q]]=x;
41             w[q][t[q]]=x*p;
42         }        
43         else
44         {
45             v[i][0]=x;
46             w[i][0]=x*p;
47         }    
48     }    
49 }
50 void work()
51 {
52     for(int i=1;i<=m;++i)
53         for(int j=n;j>=v[i][0];--j)
54         {
55             if(!v[i][0])
56                 break;
57             if(j>=v[i][0])
58                 f[j]=max(f[j],f[j-v[i][0]]+w[i][0]);
59             if(j>=v[i][1]+v[i][0])
60                 f[j]=max(f[j],f[j-v[i][1]-v[i][0]]+w[i][1]+w[i][0]);
61             if(j>=v[i][2]+v[i][0])
62                 f[j]=max(f[j],f[j-v[i][2]-v[i][0]]+w[i][2]+w[i][0]);
63             if(j>=v[i][1]+v[i][0]+v[i][2])
64                 f[j]=max(f[j],f[j-v[i][1]-v[i][0]-v[i][2]]+w[i][2]+w[i][1]+w[i][0]);
65         }
66     for(int i=0;i<=n;++i)
67         ans=max(ans,f[i]);
68     printf("%d",ans);
69 }
70 int main()
71 {
72     //input();
73     read();
74     work();
75     return 0;
76 }
瓜到哭泣

原文地址:https://www.cnblogs.com/Achensy/p/10775660.html