0-1背包问题

Description

背包问题是指有N件物品和一个容量为W的背包。第i件物品的价值是v,需要占用的容量是w。

求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

而0-1背包问题是指可选择的物品每种仅有一件,可以选择不装入某物品,即0;或选择装入某物品,即1

Input

输入有行,第一行为正整数N,代表有N件物品可选;第二行为正整数W,代表背包容量

第3行为N个数,分别代表第1到N个物品的价值v,以空格隔开

第4行为N个整数,分别代表第1到N个物品需要占用的容量w,以空格隔开

例如:

5

15

4 2 1 2 6

12 2 1 1 4

Output

输出为根据输入条件能装入的最大价值,比如对于上面输入描述中的数据,应输出

11

Sample Input 1 

5
15
4 2 6 2 8
12 1 1 1 4

Sample Output 1

18
#include<bits/stdc++.h>

using namespace std;

int main()
{
	int n, m; 
	cin >> n >> m;//n表示物品的个数,m表示背包的容量 
	vector<int> value(n+1,0);  //存放n个物品的价值 
	vector<int> volume(n+1,0); //存放n个物品所需的体积 
	
	vector<vector<int> > f(n+1,vector<int> (m+1,0));//f[i][j],存放j体积下前i个物品的最大价值 
	
	for(int i = 1; i <= n; i ++) cin >> value[i];//输入每个物品的价值 
	for(int i = 1; i <= n; i ++) cin >> volume[i];
	
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++)
		{
			if(j < volume[i]) f[i][j] = f[i-1][j];//由于当前背包的容量不足以放第i个物品,所以价值与装i-1个相同
			else f[i][j] = max(f[i-1][j],f[i-1][j-volume[i]] + value[i]);
			//这时候能装,但是需要在装与不装之间选择最大的 
		}
		
	cout << f[n][m]; 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值