背包问题

Posted WayToAccept

tags:

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

背包问题分类:

0-1背包(每种物品只有一个)

完全背包(每种物品无限多)

多重背包(每种物品Mi个,0-1背包算是多重背包的特殊情况)

混合背包

。。。

解决此类问题主要将其转化为0-1背包的问题,所以求解0-1背包的转移方程就很重要

具体的转化,优化,请参考背包九讲(前人总结的很详细啦)


下面的代码是0-1背包的通用代码

#include <iostream>
#include <vector>
#include <set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct thing

    int cost; //代价
    int value;//价值
;
thing arr[200];
int F[2000]=0;
int main()

    int n,v;//n个物品,容量为v
    while(cin>>n>>v)
    
        for(int i=0;i<n;i++)
        
            cin>>arr[i].value>>arr[i].cost;
        
        memset(F,0,sizeof(F));
        for(int i=0;i<n;i++)
        
            for(int j=v;j>=arr[i].cost;j--)
            
                F[j]=max(F[j],F[j-arr[i].cost]+arr[i].value);
            
        
        cout<<F[v]<<endl;
    
    return 0;


通过记录其前驱,可以求出把哪些物品装入了背包:

#include <iostream>
#include <vector>
#include <set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct thing

    int cost; //代价
    int value;//价值
;
thing arr[200];
int F[2][2000]=0;
int main()

    int n,v;//n个物品,容量为v
    while(cin>>n>>v)
    
        for(int i=0;i<n;i++)
        
            cin>>arr[i].value>>arr[i].cost;
        
        memset(F[0],0,sizeof(F[0])); //value
        memset(F[1],-1,sizeof(F[1]));//装入物品编号
        for(int i=0;i<n;i++)
        
            for(int j=v;j>=arr[i].cost;j--)
            
                if(F[0][j]<F[0][j-arr[i].cost]+arr[i].value)F[1][j]=i;//如果装入物品i则更新
                F[0][j]=max(F[0][j],F[0][j-arr[i].cost]+arr[i].value);
            
        
        cout<<F[0][v]<<endl;
        int index=F[1][v],weight=F[0][v];
        while(index>0)
        
            cout<<index<<" "<<arr[index].value<<" "<<arr[index].cost<<endl;
            weight-=arr[index].cost;
            index=F[1][weight];
        
    
    return 0;




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

第五讲 二维费用的背包问题(粗糙,勿点)

算法模板-01背包

算法模板-01背包

算法模板-01背包

hdu4003

背包问题