背包问题
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;
以上是关于背包问题的主要内容,如果未能解决你的问题,请参考以下文章