JOISC2014 挂饰("01"背包)

传送门:

  [1]:洛谷

  [2]:BZOJ

参考资料:

  [1]:追忆:往昔 

Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define INF 0x3f3f3f3f
 4 #define mem(a,b) memset(a,b,sizeof(a))
 5 const int maxn=2e3+50;
 6 
 7 int n;
 8 int a[maxn],b[maxn];
 9 int dp[maxn<<1];
10 
11 int Solve()
12 {
13     mem(dp,-INF);
14     dp[2001]=0;
15 
16     for(int i=1;i <= n;++i)
17     {
18         a[i]--;
19         if(a[i] > 0)
20         {
21             for(int j=4000;j >= 0;--j)
22             {
23                 if(dp[j] == -INF)
24                     continue;
25                 int k=min(j+a[i],4000);
26                 dp[k]=max(dp[j]+b[i],dp[k]);
27             }
28         }
29         else
30         {
31             for(int j=0;j <= 4000;++j)
32             {
33                 if(dp[j] == -INF)
34                     continue;
35                 dp[j+a[i]]=max(dp[j]+b[i],dp[j+a[i]]);
36             }
37         }
38     }
39     int ans=0;
40     for(int i=2000;i <= 4000;++i)
41         ans=max(ans,dp[i]);
42 
43     return ans;
44 }
45 int main()
46 {
47     scanf("%d",&n);
48     for(int i=1;i <= n;++i)
49         scanf("%d%d",a+i,b+i);
50 
51     printf("%d\n",Solve());
52 
53     return 0;
54 }
View Code

待调bug

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define INF 0x3f3f3f3f
 4 #define mem(a,b) memset(a,b,sizeof(a))
 5 const int maxn=2e3+50;
 6 
 7 int n;
 8 int a[maxn],b[maxn];
 9 int dp[maxn][maxn<<1];
10 
11 int Solve()
12 {
13     mem(dp,-INF);
14     dp[0][2001]=0;
15 
16     for(int i=1;i <= n;++i)
17     {
18         a[i]--;
19         for(int j=0;j <= 4000;++j)
20         {
21             if(dp[i-1][j] == -INF)
22                 continue;
23 
24             int k=j+a[i];
25             if(a[i] > 0)
26                 k=min(k,4000);
27             
28             dp[i][k]=max(dp[i-1][j]+b[i],dp[i-1][k]);
29         }
30     }
31     int ans=0;
32     for(int i=2000;i <= 4000;++i)
33         ans=max(ans,dp[n][i]);
34 
35     return ans;
36 }
37 int main()
38 {
39     scanf("%d",&n);
40     for(int i=1;i <= n;++i)
41         scanf("%d%d",a+i,b+i);
42     printf("%d\n",Solve());
43 
44     return 0;
45 }
View Code

猜你喜欢

转载自www.cnblogs.com/violet-acmer/p/11205582.html