关键词:
背包问题分类:
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],现在往背包里面装东西,怎么装能使背包的... 查看详情