来一个背包问题
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容
量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也
算一种放法)。
假定背包的大小为7,有五种零食,零食的体积分别为 2,3,2,4,1 。让我们来填一下动态规划表。
横向为背包容量,纵向为各个体积的零食编号,0号放置体积为2的零食,1号放置体积为1的零食,以此类推。
上图吧,
实现代码如下:
#include<iostream>
#include<vector>
using namespace std;
int dp(vector<int>&food, int w){
if((food.size()<1)||(w<=0)) return 0;
//初始化第一列
vector<vector<int>>dpcon(food.size(),vector<int>(w+1));
for(int i=0; i<food.size(); i++){
dpcon[i][0]=1;
}
for(int i=1; i<=w; i++){
if(i<food[0])
dpcon[0][i]=1;
else
dpcon[0][i]=2;
}
for(int i=1;i<food.size(); i++){
for(int j=1; j<=w; j++){
dpcon[i][j]=dpcon[i-1][j];
if(j-food[i]>=0)
dpcon[i][j]+=dpcon[i-1][j-food[i]];
}
}
return dpcon[food.size()-1][w];
}
int main(){
vector<int>food={2,3,2,4,1};
int w=7;
cout<<dp(food, w)<<endl;
return 0;
}
运行结果:
未完待续————————————————————————————————————————————————