每日一题 6月28日 队伍配置 DP
题目链接:https://ac.nowcoder.com/acm/problem/14699
题目大意:
思路:一眼题直接背包:
f[i][j][k][w]:前i个单位选择j个人,k件装备,cont==w的最大ATK。
#include <bits/stdc++.h> #define ll long long using namespace std; int a[1005], C[1005], f[605][7][7][205]; int main(){ int n, m, d; scanf("%d%d%d", &n, &m, &d); for(int i=1; i<=n+m; i++){ scanf("%d%d", &a[i], &C[i]); } for(int i=1; i<=n+m; i++){ for(int s=0; s<=d; s++){ for(int A=0; A<=5; A++){ for(int B=0; B<=5; B++){ if(i<=n){ if(s>=C[i]&&A>0){ f[i][A][B][s]=max(f[i-1][A-1][B][s-C[i]]+a[i], f[i-1][A][B][s]); } else{ f[i][A][B][s]=f[i-1][A][B][s]; } } else{ if(s>=C[i]&&B>0){ f[i][A][B][s]=max(f[i-1][A][B-1][s-C[i]]+a[i], f[i-1][A][B][s]); } else{ f[i][A][B][s]=f[i-1][A][B][s]; } } } } } } int ans=0; for(int i=1; i<=5; i++){ for(int j=1; j<=i; j++){ ans=max(ans, f[n+m][i][j][d]); } } printf("%d\n", ans); return 0; }