01背包题目的雏形是有N件物品和一个容量为V的背包。第i件物品的体积是w[i],价值是p[i]。求解将哪些物品装入背包可使价值总和最大。
从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放
代码:
//01背包思想 : 对于背包问题,先解决小背包(子背包)问题,再逐步解决原来的问题 ,每个动态规划都从一个网格开始。
#include<bits/stdc++.h>
using namespace std;
int f[5][9]={0};
int w[5]={0,2,3,4,5},p[5]={0,3,4,5,8}; //w数组为体积 ,p数组为价值
//f[i][j] 背包容量大小为j ,可以有i件偷,所能获得的最大价值
int main(){
int i,j;
memset(f,0,sizeof(f));
for(int i =1;i<5;i++) //i = 1,2,3,4 四件商品
{
for(int j = 1;j<9;j++) //j 是背包空间
{
if(j<w[i])//商品体积大于背包容量则不偷
{ // cout<<"第"<<i<<"件商品重量为:"<< w[i]<<",大于目前背包容量:" <<j<<endl;
// cout<<"所以不偷第"<<i<<"件商品 "<<endl;
f[i][j]=f[i-1][j];
//cout<<"f["<<i<<"]["<<j<<"]="<<f[i][j]<<endl;
}
else {
// cout<<"----------------------------------------------------"<<endl;
// cout<<"第"<<i<<"件商品重量为:"<< w[i]<<",小于或等于目前背包容量:" <<j<<endl;
// cout<<"f["<<i-1<<"]["<<j<<"]= "<<f[i-1][j]<<" "<<"f["<<i-1<<"]["<<j<<"-"<<"w["<<i<<"]]+"<<"p["<<i<<"]="<<f[i-1][j-w[i]]+p[i]<<" "<<"f["<<i-1<<"]["<<j<<"-"<<w[i]<<"]"<<"+"<<p[i]<<"="<<f[i-1][j-w[i]]+p[i];
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);
//cout<<" 填表:"<<"f["<<i<<"]["<<j<<"]="<<f[i][j]<<endl;
cout<<endl;
}
}
}
for(int i =1;i<5;i++){
for(j=1;j<9;j++){
cout<<"f["<<i<<"]["<<j<<"] "<<f[i][j]<<" ";
}
cout<<endl;
}
return 0;
}