Newcoder Wannafly24C 失衡天平 DP
Posted itst
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Newcoder Wannafly24C 失衡天平 DP相关的知识,希望对你有一定的参考价值。
题意:给你$N$个数,你可以将其划分为若干对集合(这里所说的集合允许数字重复)(即集合是两个集合两个集合出现),每对集合中两个集合所有元素的和的差的绝对值不超过$M$,可以有数字不在集合内,可以有集合为空。求所有集合内数的和的最大值。$N leq 100 , M leq 100$,数字$leq 100$
虽然考试的时候没做出来但还是感觉这是一道大水题
可以发现:划分若干对集合和划分一对集合是等效的,因为假如说一对集合$A,B$中$sum A leq sum B(sum A$表示集合$A$中所有元素的和$)$,另一对集合$C,D$满足$sum C leq sum D$,那么集合$A+D,B+C$一定是满足条件的(显然)。所以我们就是要划分两个集合使得其差的绝对值不超过$M$且和最大。模型与多米诺骨牌类似。
1 #include<bits/stdc++.h>
2 using namespace std;
3
4 int dp[20010] , pot[20010];
5
6 int main(){
7 ios::sync_with_stdio(0);
8 cin.tie(0);
9 cout.tie(0);
10 int N , M;
11 cin >> N >> M;
12 memset(pot , -0x3f , sizeof(pot));
13 memset(dp , -0x3f , sizeof(dp));
14 dp[10000] = 0;
15 for(int i = 1 ; i <= N ; i++){
16 int a;
17 cin >> a;
18 for(int j = a ; j <= 20000 ; j++)
19 pot[j - a] = max(pot[j - a] , dp[j] + a);
20 for(int j = 0 ; j <= 20000 - a ; j++)
21 pot[j + a] = max(pot[j + a] , dp[j] + a);
22 for(int j = 0 ; j <= 20000 ; j++)
23 dp[j] = max(dp[j] , pot[j]);
24 }
25 int ans = 0;
26 for(int i = 10000 ; i <= 10000 + M ; i++)
27 ans = max(ans , dp[i]);
28 cout << ans;
29 return 0;
30 }
以上是关于Newcoder Wannafly24C 失衡天平 DP的主要内容,如果未能解决你的问题,请参考以下文章
newcoder PAT 1001 Rational Sum (20)