标签:
背包问题 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