分组背包


刚开始看分组背包的题目,想了一下,觉得好难啊,跟前面一点都联系不上啊,怎么办怎么办

但其实啊

跟01背包有异曲同工之处的,我觉得是01背包和多重背包的结合体???

一直在纠结一个组里面选一个其他都不能再选了,巴拉巴拉...

这...不就是01背包的思想吗?

就是一个组,s个物品,只可能会有s+1种决策,这种决策是相互独立的啊,要么选第0个,要么选第1个,巴拉巴拉...

数据范围也不大,可以直接开三重循环,一重枚举组数,一重枚举j背包容量,一种枚举决策。

从大到小哦,别忘了

哇靠,手敲了一边代码,真的觉得分组背包是最简单的背包,希望不要打脸哦

刚开始我写的时候状态转移方程错了,还在想判断条件为什么要j>=v[k],哈哈哈哈,原来状态转移方程错了呀

这个k是第几个决策的意思,第k个,所以状态转移方程是f[j]=max(f[j],f[j-v[k]]+w[k])

哈哈哈哈,被自己蠢到了,hhh

#include
using namespace std;
const int N=110;
int v[N],w[N],f[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i)
    {
        int s;
        cin>>s;
        for(int j=0;j>v[j]>>w[j];
        for(int j=m;j>=0;j--)
        {
            for(int k=0;k)
            {
                if(j>=v[k])
                f[j]=max(f[j],f[j-v[k]]+w[k]); 
            }
        }
    }
    cout<endl;
    return 0;
}