就是有不同组 ,看一道例题 !!
可以这样去想 就是去划分 每一个地方 然后去看对于不同组能不能得分 如果能那就对于该地方的值+1 依次去枚举每一个地方 这样求出最大的!
#include <bits/stdc++.h> using namespace std; int a[101][101],f[20001]; int s,n,m; int main() { cin>>s>>n>>m; int i,j,k; for(i=1;i<=s;i++) { for(j=1;j<=n;j++) cin>>a[j][i]; } for(i=1;i<=n;i++) sort(a[i]+1,a[i]+s+1); for(i=1;i<=n;i++) { for(j=m;j>=0;j--) { for(k=1;k<=s;k++) { int g=a[i][k]*2+1; if(j>=g) f[j]=max(f[j],f[j-g]+k*i); //从小到大已经排完序了,现在就是去弄枚举到k k之前的一定能满足也就是有收益!!! } } } int ans=0; for(i=1;i<=m;i++) ans=max(ans,f[i]); cout<<ans; }