传送门:
[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 }
待调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 }