队伍配置(dp)
队伍配置
https://ac.nowcoder.com/acm/problem/14699
题意:略。
题记:每一个从者和礼装都当成是一个物品,那么物品只有选和不选两种情况。(背包的思想)
dp[i][j][k][l]表示前i个物品cost值为j选了k个从者和l件礼装。
在循环时可以把数组第一维优化掉(跟背包问题一样优化)。
在输入从者时:
dp[j][k][0]=max(dp[j][k][0],dp[j-y][k-1][0]+x);
在输入从者时:
dp[j][k][l]=max(dp[j][k][l],dp[j-y][k][l-1]+x);
在每次计算时用ans去取最大值即是答案。
#include<bits/stdc++.h>
using namespace std;
int dp[200][10][10];
int main(){
int n,m,d;
cin>>n>>m>>d;
int x,y,ans=0;
for(int i=1;i<=n;i++){
cin>>x>>y;
for(int j=d;j>=y;j--){//枚举cost值
for(int k=1;k<=5;k++){//枚举从者
dp[j][k][0]=max(dp[j][k][0],dp[j-y][k-1][0]+x);
ans=max(ans,dp[j][k][0]);
}
}
}
for(int i=1;i<=m;i++){
cin>>x>>y;
for(int j=d;j>=y;j--){//枚举cost值
for(int k=1;k<=5;k++){//枚举从者
for(int l=1;l<=k;l++){//枚举礼装
dp[j][k][l]=max(dp[j][k][l],dp[j-y][k][l-1]+x);
ans=max(ans,dp[j][k][l]);
}
}
}
}
cout<<ans<<endl;
return 0;
}