与就有了 dp [a][b][c][d](我们可以求出这个状态在 a1 + b * 2 + c * 3 + d * 4 位置) , 表示用了 a 张第一种卡片,b 张第二种,c 张第三种,d 张第四种卡片,假如当前枚举使用的是 第二种卡片,那么从 dp [a][b][c][c] 可以递推出 dp [a][b+1][c][d] 这个状态 (这个状态在 a * 1 + (b+1) * 2 + c3+d*4) 位置.
枚举其他卡片同理也能递推出其他状态
代码
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<string>#include<queue>#include<map>#include<bitset>#include<vector>
using namespace std;voidfre(){system("clear"),freopen("A.txt","r",stdin);freopen("Ans.txt","w",stdout);}voidFre(){system("clear"),freopen("A.txt","r",stdin);}voidRun(int x =0){#ifdef ACM //宏定义免注释 freopenif(! x)fre();elseFre();#endif}#define ios ios::sync_with_stdio(false)#define Pi acos(-1)#define pb push_back#define fi first#define se second#define db double#define ll long long#define ull unsigned long long#define Pir pair<ll, ll>#define m_p make_pair#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)#define memset(a, b, c) memset(a, (int)b, c);#define size() size() * 1LL#define sc scanf#define pr printf#define sd(a) sc("%lld", &a)#define ss(a) sc("%s", a)#define __ pr( "------------------------\n" );#define ___ pr("\n------------------------\n");#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f3f3f3f3f#define esp 1e-7#define mod (ll)(1e9 + 7)/*=========================ACMer===========================*/constint N =45;int dp[N][N][N][N];int a[500], num[N];intmain(){Run();int n, m;sc("%d %d",&n,&m);for(int i =1; i <= n; i ++)sc("%d",&a[i]);for(int i =1; i <= m; i ++){int x;sc("%d",&x);
num[x]++;}
dp[0][0][0][0]= a[1];for(int i =0; i <= num[1]; i ++){for(int j =0; j <= num[2]; j ++){for(int k =0; k <= num[3]; k ++){for(int l =0; l <= num[4]; l ++){int s =1+ i *1+ j *2+ k *3+ l *4;if(i < num[1]){int p = s +1;
dp[i +1][j][k][l]=max(dp[i +1][j][k][l], dp[i][j][k][l]+ a[p]);}if(j < num[2]){int p = s +2;
dp[i][j +1][k][l]=max(dp[i][j +1][k][l], dp[i][j][k][l]+ a[p]);}if(k < num[3]){int p = s +3;
dp[i][j][k +1][l]=max(dp[i][j][k +1][l], dp[i][j][k][l]+ a[p]);}if(l < num[4]){int p = s +4;
dp[i][j][k][l +1]=max(dp[i][j][k][l +1], dp[i][j][k][l]+ a[p]);}}}}}pr("%d\n", dp[num[1]][num[2]][num[3]][num[4]]);return0;}