背包问题
小偷有一个包,容积有限,偷东西,东西有重量和价值,要求偷的价值最大。
这是一个典型的动态规划问题。比起递归呢,通过预存数组记录每次结果,避免了重复计算,
也算是牺牲了空间来换取时间,降低复杂度。
1、重复背包问题: 每种物品有无限个,任意取:
框架:
int k[weight+1]={0}; //包容积为weight的最大价值,先全初始化为0
for(int i=1;i<weight+1;i++) 包容积递增:1~~weight 递增至最终容积
{
for(int j=0;j<item;j++) 进行产品遍历,看当前容积哪些产品放得下
{
if(i>=w[j]) k[i]= ( k[i-w[j]]+v[j] )>k[i] ? ( k[i-w[j]]+v[j] ) : k[i] ;
//如果放的下,就进行比较,看放不放、放哪一件时价值最大,不断比较
}
}
代码:
#include<iostream>
using namespace std;
int main()
{
int weight,item; //weight是包的容积 item是物品件数
cout<<"intput the number of items:";
cin>>item;
cout<<"input the weight of bag:";
cin>&