0-1背包问题:
容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2,3,4,5。
设计算法,实现背包内物品价值最大。
int Get_max(int m,vector<int>&w,vector<int>&v)
{
vector<int> fmax(m+1,0);
for(int i = 0; i < w.size(); i++)
{
for(int j = m; j >= w[i]; j--)
{
fmax[j] = max(fmax[j], fmax[j -w[i]] + v[i]);
}
}
return fmax[m];
}
int main()
{
int m;
cin >> m; //背包容量
int n; //物品个数
cin >> n;
vector<int> w(n);
for(int i = 0; i < n; i++)
{
cin >> w[i];
}
vector<int> v(n);
for(int i = 0; i < n; i++)
{
cin >> v[i];
}
//背包所承受最大价值
cout << Get_max(m,w,v) << endl;
return 0;
}
完全背包问题:
容量为10的背包,有5种物品,每种物品数量无限,其重量分别为5,4,3,2,1,其价值分别为1,2,3,4,5。
设计算法,实现背包内物品价值最大。
//完全背包问题
int Total_bag(int m,vector<int>&w, vector<int>&v)
{
vector<int> fmax(m+1,0);//初始化数组元素
for(int i = 0; i < w.size(); i++)
{
for(int j = w[i]; j <= 10; j++)
{
fmax[j] = max(fmax[j], fmax[j-w[i]] + v[i]);
}
}
return fmax[m];
}
多重背包问题:
容量为10的背包,有5种物品,每种物品数量分别为1,2,1,2,1,其重量分别为5,4,3,2,1,其价值分别为1,2,3,4,5。
设计算法,实现背包内物品价值最大。
//多重背包问题
//tmp是存储每种物品数量的那个数组
int Muil_bag(int m,vector<int>&w, vector<int>&v, vector<int>&tmp)
{
vector<int> fmax(m+1,0); //初始化数组元素
for(int i = 0; i < w.size(); i++)
{
//k不能等于0
for(int k = 1; k <= tmp[i]; k++)
{
for(int j = m; j >= w[i]; j--)
{
fmax[j] = max(fmax[j], fmax[j - w[i]] + v[i]);
}
}
}
return fmax[m];
}
引路这位博主博客~有图解~:https://blog.csdn.net/liqinzhe11/article/details/78428216