首页 > 其他分享 >7-1 0-1背包

7-1 0-1背包

时间:2022-10-24 23:22:20浏览次数:47  
标签:背包 容量 int max wi 物品

7-1 0-1背包 分数 25   作者 郑琪 单位 广东外语外贸大学

给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

输入格式:

共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

输出格式:

输出装入背包中物品的最大总价值。

输入样例:

5 10
2 6
2 3
6 5
5 4
4 6
 

输出样例:

15
  代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB       //m[i][j]表示从 i 到 n,背包剩余容量为j
/*
m[i][j]=max{m(1+1,j),m(i+1,j-w[i])+vi}    j>=w[i];
m[i][j]=m[[i+1][j]                        0<=j<w[i];
边界条件: m[n][j]=v[n]   j>=w[n];
m[n][j]=o   0<=j<w[n]
*/
#include<iostream>
using namespace std;
int n,C;//n:物品个数  C:背包最大容量
int v[101],w[1001],m[101][1001];//m(i,j) 表示背包可用容量为j(1<=j<=w),已考虑物品 1,2,3, ... ,i(1<=i<=n) 时的最优解的值。

int dp(){
    
 for(int j=0;j<=C;j++){//背包剩余容量为j
  if(j>=w[n]) m[n][j]=v[n];//
  else m[n][j]=0;//物品比背包大
 }
 
 for(int i=n-1;i>=1;i--){//从最后一个物体开始算到第一个物体
  for(int j=0;j<=C;j++){
   if(j>=w[i]) m[i][j]=max(m[i+1][j-w[i]]+v[i],m[i+1][j]);//i+1时的解加上i的重量和价值  与 不加i的(i+1时的解)相比较
   else m[i][j]=m[i+1][j];//j<w[i]第i个物体装不下
  }
 
 }
 return m[1][C];//表格最右上边
}


int main(){
 cin>>n>>C;
 for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
 cout<<dp();
}


/*  
    需要求的最大价值
    max (v1x1+v2x2+v3x3+......+vixi+vnxn)
    
    需要求的最大价值所占的最大空间
    w1x1+w2x2+w3x3+......+wixi+wnxn<=C
    
    xi=0或1  1<=i<=n
    
定义子问题P(i,W)为:在前i个物品中挑选总重量不超过W的物品,每种物品至多
只能挑选1次,使得总价值最大,此时的最优值记作f(i,W),其中1<=i<=n,1<=W<=C

考虑第i个物品,只有两种可能:选。不选
不选》》》背包容量不变,P(i-1,W)
选》》》 背包容量减小,P(i-1,W-wi)

最优方案就是两个方案哪个更好些
f(i,W)=max{f (i-1,W),f(i-1,W-wi)+vi}

0                    i=0
0                   W=0
f (i-1,W)        wi>W
f(i-1,W-wi)+vi    otherwise

[如果从第一个开始,i=1的话,则i+1,W-w

f(i,j) 表示背包可用容量为j(1<=j<=w),已考虑物品 1,2,3, ... ,i(1<=i<=n) 时的最优解的值。
状态方程:
    f(i,j)=f(i-1,j) j<w[i]时,物品i放不下
    f(i,j)=max{f(i-1,j) , f(i-1,j-w[i])+v[i]}    j>=w[i]时,在放入和不放入物品i之间选最优解
边界条件:
    f(i,0)=0 背包不能装入任何物品,总价值为0
    f(0,j)=0 没有任何物品装入,总价值为0
    

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=1010;
int n;//n种物体(n<=100)
int C;//背包容积 C(C<=1000)
int v[N],value[N];// 第i(1≤i≤n)件物品的空间和价值。
int f[N];//最优解
int main()
{
    cin>>n>>C;
    
    for(int i=1;i<=n;i++)  cin>>v[i]>>value[i];
    
    for(int i=1;i<=n;i++)
      for(int j=C;v[i]<=j;j--)
         f[j]=max(f[j],f[j-v[i]]+value[i]);
       cout<<f[C]<<endl;
    return 0;
}
*/

标签:背包,容量,int,max,wi,物品
From: https://www.cnblogs.com/pfwvan666/p/16823437.html

相关文章

  • CF 788C(The Great Mixing-背包)
    有k瓶饮料,碳酸含量为a_1/1000,每瓶饮料取整数分,问怎么凑出x/1000的饮料。0<=a_i<=1000显然a1−n+a2−n+...+ak−n=0建图,在[-1000,1000]上每个点连出k条边,求经过0点的最小......
  • P1833 樱花 (混合背包)
    樱花题目背景《爱与愁的故事第四弹·plant》第一章。题目描述爱与愁大神后院里种了\(n\)棵樱花树,每棵都有美学值\(C_i(0\leC_i\le200)\)。爱与愁大神在每天上......
  • 01背包问题-简单1
    //0·1背包问题---采药.cpp---洛谷1048#include<iostream>#include<algorithm>#include<iomanip>usingnamespacestd;constintN=1e3+10;intTime[1001];......
  • 0-1背包问题代码
    一、什么是01背包问题?        举个例子,你要去一个水果摊拿水果,每种水果都有对应的两种属性:占用的体积V和蕴含的价值W。而你的背包体积为N。老板说:每种水果只能拿......
  • 分组背包问题
    [NOIP2006]金明的预算方案https://ac.nowcoder.com/acm/problem/16671题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞......
  • 动态规划实现0-1背包客问题
    #include<iostream>usingnamespacestd;//动态规划实现0-1背包客问题#defineC40#defineMYNUM10//第0个不算物品,实际有n-1个物品intm[MYNUM][C];typedefstru......
  • POJ-1276-Cash Machine(多重背包)
    CashMachineTimeLimit:1000MSMemoryLimit:10000KTotalSubmissions:30568Accepted:11018DescriptionABankplanstoinstallamachineforca......
  • acwing 分组背包问题
    题面有N组物品和一个容量是V的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号。求解将哪些物品......
  • acinwg 多重背包问题 I
    题面有N种物品和一个容量是V的背包。第i种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输......
  • acinwg 多重背包问题 II
    题面有N种物品和一个容量是V的背包。第i种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输......