背包问题(代码片段)

WayToAccept WayToAccept     2022-12-12     161

关键词:

背包问题分类:

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;




背包问题(代码片段)

文章目录0-1背包问题完全背包问题多重背包问题多重背包问题1多重背包问题2背包问题代码模板和leetcode相关例题参考0-1背包问题一件物品,只有选和不选两种情况,也就是每件物体,最多选一次;优化空间。if(v[i... 查看详情

javascriptjavascript背包问题(代码片段)

查看详情

javascriptjavascript背包问题(代码片段)

查看详情

背包问题(代码片段)

背包问题贪心算法一问题描述二问题分析**三代码实现packageknapsnap;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.util.Arrays;importjava.util.Comparator;publicclassbinpublicstaticvo 查看详情

偷东西的学问-背包问题(代码片段)

目录背包问题(0-1背包问题)可以偷商品的一部分吗(完全背包问题)物以稀为贵(多重背包问题)背包问题(0-1背包问题)假设你是个小偷,背着一个可装4磅东西的背包。你可盗窃的商品有如下3件(摘自算法图解):作为一... 查看详情

动态规划问题3--多重背包(代码片段)

多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,... 查看详情

动态规划问题3--多重背包(代码片段)

多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,... 查看详情

java01背包问题(代码片段)

查看详情

golang01背包问题(代码片段)

查看详情

动态规划多重背包问题(代码片段)

说明前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题——多重背包。这个背包,听起来就很麻烦的样子。别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟。如果没有看过前两篇01背包和完... 查看详情

背包问题(贪心策略)(代码片段)

原创给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?物品时可以拆分的,比如可以将物品的三分之一放入背包。使用优先放入【价值/重量... 查看详情

混合背包问题(代码片段)

原题链接如果s为0,那么是完全背包问题,用完全背包的方法求解如果s为-1,那么是01背包问题,把它当做数量为1的特殊的多重背包(其实它就是特殊的多重背包问题)s为某个数,那么就是普通的多重... 查看详情

完全背包问题(代码片段)

Piggy-Bank BeforeACMcandoanything,abudgetmustbepreparedandthenecessaryfinancialsupportobtained.ThemainincomeforthisactioncomesfromIrreversiblyBoundMoney(IBM).Theideabehindissimple.WheneversomeACM 查看详情

动态规划-背包问题(代码片段)

背包问题是一种组合优化的NP完全问题。有N个物品和容量为W的背包,每个物品都有自己的体积w和价值v,求拿哪些物品可以使得背包所装下的物品的总价值最大。如果限定每种物品只能选择0个或1个,则问题称为0-1背... 查看详情

背包问题(代码片段)

一、01背包有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。这是最基础的背包问题,总的来说就是:... 查看详情

算法----01背包问题和完全背包问题leetcode系列问题题解(代码片段)

背包问题1、01背包入门1.1二维背包1.2一维背包2、01背包问题2.1背包装最多问题416.分割等和子集1049.最后一块石头的重量II2.2凑满背包方法数问题494.目标和2.3双重维度问题474.一和零3、完全背包问题3.1凑满组合问题518.零钱兑换II3.2... 查看详情

算法----01背包问题和完全背包问题leetcode系列问题题解(代码片段)

背包问题1、01背包入门1.1二维背包1.2一维背包2、01背包问题2.1背包装最多问题416.分割等和子集1049.最后一块石头的重量II2.2凑满背包方法数问题494.目标和2.3双重维度问题474.一和零3、完全背包问题3.1凑满组合问题518.零钱兑换II3.2... 查看详情

01背包问题和完全背包问题(代码片段)

...coder上面的题目中看到的这个问题,总结一下。先看01背包问题。01背包问题:一个背包总容量为V,现在有N个物品,第i个物品体积为weight[i],价值为value[i],现在往背包里面装东西,怎么装能使背包的... 查看详情