这样做没错呀
```
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s;//除了小C以外的玩家人数
ll n,m;//城堡数和每名玩家拥有的士兵数
ll people;//表示一名玩家的策略
struct NODE
{
ll soldier;
ll point;
}l;
bool cmp(NODE x,NODE y)
{
return x.soldier<y.soldier;
}
vector<NODE> thing[110];
ll dp[200001],ans;
int main()
{
scanf("%lld%lld%lld",&s,&n,&m);
ll i,j,k;
for(i=1;i<=s;i++)
{
for(j=1;j<=n;j++)
{
bool flag=false;
ll maxx=0,maxl=-1;
scanf("%lld",&people);
for(k=0;k<thing[j].size();k++)
{
if(thing[j][k].soldier==people*2+1)
{
flag=true;
thing[j][k].point+=j;
}
if(thing[j][k].soldier<people*2+1)
{
if(maxx<thing[j][k].soldier)
{
maxx=thing[j][k].soldier;//易错
maxl=k;
}
}
if(thing[j][k].soldier>people*2+1)
thing[j][k].point+=j;
}
if(flag==false)
{
if(maxl!=-1)
l.point=thing[j][maxl].point+j;
else
l.point=j;
l.soldier=people*2+1;
thing[j].push_back(l);
}
}
}
for(i=1;i<=n;i++)
for(j=m;j>=0;j--)
for(k=0;k<thing[i].size();k++)
{
if(j>=thing[i][k].soldier)
dp[j]=max(dp[j],dp[j-thing[i][k].soldier]+thing[i][k].point);
}
for(i=1;i<=m;i++)
ans=max(ans,dp[i]);
printf("%lld",ans);
return 0;
}
```
by 詹昕蕾 @ 2021-08-09 19:49:29