方程。f[i][v]=max
如果理解了01背包,那么完全背包只是它的小小转化,应该不难理解,这样的算法就达到了o(n*v*k)了,但是还是可以优化成o(n*v),伪**:
for i=1..n
for v=0..v
f[v]=max
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=v;j>=c[i];j++)
dp[j]=max(dp[j],dp[j-c[i]]+w[i]);01背包。
对比。memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=c[i];j<=v;j++)
dp[j]=max(dp[j],dp[j-c[i]]+w[i]);完全背包。
多重背包。什么是多重背包?
例子:有n种物品和一个容量为v的背包。第i种物品最多有n[i]件可用,每件体积是c[i],价值是w[i]。
求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
分析:完全背包没有个数限制,这个就有个数限制,能否用完全背包的思想呢?(是我这句话的意思显然是不能)
背包九讲里的状态方程:
f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(k=0;k<=num[i];k++)
for(j=m;j>=c[i]*k;j--)
dp[i][j]=max(dp[i][j],dp[i-1][j-c[i]*k]+w[i]*k);
复杂度m*num[i]*n
二维费用背包。
二维费用就是取一件物品,要付出两种代价,比如:之前我们有个容量v可供消耗,那么,再加一种重量u,即一个背包有了两个属性值,v和u,原来它只有一个属性v,物品有了两个属性,那么对应的每种物品的属性也增加了一种即重量,物品就有了三个属性:大小,重量,价值,那么要得到一个物品的价值就要同时花费v和u;这就是所谓的二维费用的概念。
首先:还是来看看我们的01背包**。
for(i=1;i<=n;i++)
for(j=v;j>=w[i];j--)
if(dp[j] dp[j]=dp[j-w[i]]+v[i];
其次对比二维费用**。
for(i=1;i<=n;i++)
for(j=v;j>=w[i];j--)容量的循环。
for(k=m;k>=u[i];k--)多加了一层重量的循环。
if(dp[j][k] dp[j][k]=dp[j-w[i]][k-u[i]]+v[i];
酒店餐饮常用的各种单据及使用
1 点菜单 此单一式三联,第一联由收银员交财务,第二联送交后厨,第三联交给客人。2 吧台酒水单 此单一式三联,第一联酒水员留底,第二。联交给收银员,第三联交给客人,3 菜肴更正单 此单主要是应客人要求加减菜肴,与 点。菜单 的使用方法相同。4 酒水商品入库单 此单一式三联,第一联留底,第二联。交给财...
酒店餐饮常用的各种单据及使用
1 点菜单 此单一式三联,第一联由收银员交财务,第二联送交后厨,第三联交给客人。2 吧台酒水单 此单一式三联,第一联酒水员留底,第二联交给收银员,第三联交给客人,3 菜肴更正单 此单主要是应客人要求加减菜肴,与 点菜单 的使用方法相同。4 酒水商品入库单 此单一式三联,第一联留底,第二联交给财务,第...
酒店餐饮常用的各种单据及使用
1 点菜单 此单一式三联,第一联由收银员交财务,第二联送交后厨,第三联交给客人。2 吧台酒水单 此单一式三联,第一联酒水员留底,第二联交给收银员,第三联交给客人,3 菜肴更正单 此单主要是应客人要求加减菜肴,与 点菜单 的使用方法相同。4 酒水商品入库单 此单一式三联,第一联留底,第二联交给财务,第...