分组背包这个没啥!

发布时间 2023-03-23 19:19:25作者: _Lance

就是有不同组 ,看一道例题 !!    

可以这样去想 就是去划分 每一个地方 然后去看对于不同组能不能得分  如果能那就对于该地方的值+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;
}