背包问题总结

Posted newstartcy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包问题总结相关的知识,希望对你有一定的参考价值。

//背包问题总结(根据背包九讲) 2019 9/26 会更新完
//0 - 1背包变种问题 (HDU3466)
//唔,0 1背包太简单了,主要是排序
//因为DP v 是从 m 到 w[i]的,但是现在增加了一个限定值,如果限定值小于等于w[i]的话,无影响,但是如果大于w[i]的话,就会存在一个q - p的差的范围是0
//所以应该将 差值范围小的尽可能排放在前面 so 根据 q - p差值范围排序
//或者假设 物品 A PA,QA
//     物品 B PB,QB
//  先放物品A v = PA + QB, 先放物品B v = PB + QA
//因此如果得先放A物品 则 PA + QB < PB + QA
//QA - PA > QB - PB
//因为DP是逆序的嘛,反一下就好了,画个图想想
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 5e3 + 15;
int f[maxn];
int n,m;//n件物品
typedef struct
{
    int w,limit,v;
}article;
vector<article> vr;
bool cmp(const article& a1,const article& a2)
{
    return a1.w + a2.limit > a2.w + a1.limit;
}
int main()
{
    while(cin>>n>>m)
    {
        vr.clear();
        memset(f,0,sizeof(f));//背包
        article tmp;
        for(int i=0;i!=n;++i)
        {
            cin>>tmp.w>>tmp.limit>>tmp.v;
            vr.push_back(tmp);
        }//放入物品
        sort(vr.begin(),vr.end(),cmp);
        for(int i=0;i!=n;++i)
        {
            int maxValue = max(vr[i].limit,vr[i].w);
            for(int v=m;v>=maxValue;--v)
            {
                f[v] = max(f[v],f[v-vr[i].w]+vr[i].v);
            }
        }
        cout<<f[m]<<endl;
    }
}

  

以上是关于背包问题总结的主要内容,如果未能解决你的问题,请参考以下文章

背包问题总结

背包问题总结

01背包完全背包多重背包分组背包总结

总结背包问题的至多/恰好/至少

背包问题总结

树上背包问题做题总结