码迷,mamicode.com
首页 > 其他好文 > 详细

【动态规划】背包问题

时间:2015-06-15 14:24:03      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

背包问题
01背包
有N件物品和一个容量为V的背包。第i件物品的重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大
for(int i = 1; i <= n; i++)
for(int j = v; j >= c[i]; j--){
dp [j] = max(dp [j], dp [j - c[i]] + w[i]);
Susake = max(Susake, dp[j]); }
多重背包
有N种物品和一个容量为V的背包。第i种物品最多有n件可用,每件体积是c,价值是w。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大
for(int i = 1; i <= n + 1; i++)//n种物品
for(int j = v; j >= 0; j--)
for(int k = 0; k <= t[i]; k++)//最t[i]件
{
if(j >= k * c[i]) dp[j] = max(dp[j], dp[j - k * c[i]] + k * w[i]);
Susake = max(Susake, dp[j]);}//最大值
完全背包
有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是c,    价值是w。将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和    最大
for(i = 1; i <= n; i++)
for(j = b[i]; j <= v2; j++)
dp[j] = max(dp[j], dp[j - b[i]] + a[i]);
Susake = dp[v2];//最大值
多维费用背包
对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值
for(int i=0;i<n;i++)
for(int ii=v1;ii>=0;ii--)
for(int jj=v2;jj>=0;jj--)
for(int kk=k;kk>=0;kk--){
int Susake=0;
if(ii>=a[i]) Susake=max(Susake,dp[ii-a[i]][jj][kk]+c[i]);
if(jj>=b[i]) Susake=max(Susake,dp[ii][jj-b[i]][kk]+c[i]);
if(kk>=1) Susake=max(Susake,dp[ii][jj][kk-1]+c[i]);
dp[ii][jj][kk]=max(Susake,dp[ii][jj][kk]);} 
Susake = dp[v1][v2][k];//最大值

 

【动态规划】背包问题

标签:

原文地址:http://www.cnblogs.com/Susake/p/4576849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!