luogu P5322 [BJOI2019] 排兵布阵
原题链接
#include<bits/stdc++.h>
using namespace std;
/*
样例分析:
1 2 10
2 2 6
5 5 0
解题思路:
注意到关键词“这 s 场对决的派遣士兵方案必须相同”
分组背包:
组别:第 i 座城堡
物品:第 j 个敌人对第 i 座城堡
价值:i
体积:敌人士兵数目二倍加一
然而以上分法还有问题,即,对于样例二来讲,在上述分法的
定义下,第二座城堡只得 2 分,然而实际上得 4 分,所以,
还需要将每个组别经行排序,并使其价值为 j*i,即解决问题
*/
const int M = 20010,N=110;
int s,n,m;
int v[N][N];//v[i][j 第 i 座城堡第 j 个敌人的战胜代价
int f[M];
int main(){
scanf("%d%d%d",&s,&n,&m);
for(int j=1;j<=s;j++)
for(int i=1;i<=n;i++)
scanf("%d",&v[i][j]),v[i][j]=v[i][j]*2+1;
for(int i=1;i<=n;i++)
sort(v[i]+1,v[i]+s+1);
for(int i=1;i<=n;i++){//100
for(int j=m;j>=0;j--){
for(int z=1;z<=s;z++)
if(j>=v[i][z])
f[j]=max(f[j],f[j-v[i][z]]+i*z);
}
}
printf("%d",f[m]);
return 0;
}