分组背包---P1757 通天之分组背包

P1757 通天之分组背包

题解

分组背包板子题

k组物品,每组之间相互矛盾,也就是一组里面只能选一个或者不选

 

分组背包其实和01背包差不多,就是多加一维枚举组数

f[k][j] 前k组中,体积不超过 j 的最大价值

降一维求解nice 

 

然后注意枚举顺序:

 

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>

using namespace std;

typedef long long ll;

inline int read()
{
    int ans=0;
    char last=' ',ch=getchar();
    while(ch<'0'||ch>'9') last=' ',ch=getchar();
    while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int n,m,zu=0;
int f[1005];
int v[1005],w[1005],z[1005];
int s[105][105];

int main()
{
    m=read();n=read();
    for(int i=1;i<=n;i++) 
       v[i]=read(),w[i]=read(),z[i]=read(),
       zu=max(zu,z[i]),
       s[z[i]][++s[z[i]][0]]=i;

    for(int k=1;k<=zu;k++)
      for(int j=m;j>=0;j--)
        for(int i=1;i<=s[k][0];i++){
            if(v[s[k][i]]>j) continue;
            f[j]=max(f[j],f[j-v[s[k][i]]]+w[s[k][i]]);
        }
           
    printf("%d\n",f[m]);
    return 0;
}

 

posted @ 2019-12-04 17:38  晔子  阅读(366)  评论(0编辑  收藏  举报