1.问题描述
背包问题是算法中的一个经典问题,它有很多子问题,比如0-1背包问题,完全背包问题,多重背包问题等等。而今天所说的0-1背包问题的原始描述为:现在有N件物品和一个最大承载重量为M的背包,要从这N件物品中选择其中的K(1<=k<=N)件,使得所选择的物品的价值总和最大且其总重量不超过背包的最大载重量。这N件物品的第i件物品的重量和价值分别是weight[i],value[i].在解决实际问题时,需要将问题转换为0-1背包问题进行求解。例如:http://hihocoder.com/problemset/problem/1038.
2.算法思路
0-1背包问题的解决思路主要有:贪心算法,回溯法,动态规划等等。
3.实现代码
#include<iostream>
using namespace std;
struct Node{
int need;
int value;
};
int main(){
int n=0,m=0;
cin>>n>>m;
Node* node=new Node[n];
for(int i=0;i<n;++i){
cin>>node[i].need;
cin>>node[i].value;
}
int* best=new int[m+1];
for(int i=0;i<=m;++i){
best[i]=0;
}
for(int i=0;i<n;++i){
//由大到小进行计算是为了降低空间复杂度到O(M).
for(int j=m;j>=node[i].need;--j){
if(best[j] < best[j-node[i].need]+node[i].value){
best[j]=best[j-node[i].need]+node[i].value;
}
}
}
cout<<best[m]<<endl;
delete []best;
delete []node;
return 0;
}