贪心0/1背包
题目描述
有
一容量为weight的背包。现在要从n件物品中选取若干装入背包中,每件物品i的重量为w[i],价值为p[i]。定义一种可行的背包装载为:背包中物
品的总重量不能超过背包的容量,并且一个物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。
输入
第1行一个整数,表示背包的重量weight
第2行一个整数,表示n件物品
第3行有n个整数,分别表示n个物品的重量
第4行有n个整数,分别表示n个物品的价值
第2行一个整数,表示n件物品
第3行有n个整数,分别表示n个物品的重量
第4行有n个整数,分别表示n个物品的价值
输出
共两行。第1行n个物品的选取状态,0表示不取,1表示取。n个状态用空格分隔,行尾无空格。第2行表示装入物品的最高价值。
样例输入
11
4
2 4 6 7
6 10 12 13
样例输出
0 1 0 1
23
经典的问题
#include <bits/stdc++.h> using namespace std; const int maxn = 1001; int n, c, MAX;//n:个数, c:容量, MAX:最大价值 int v[maxn], w[maxn], x[maxn], last[maxn];//v 价值 w 重量 x 目前装载 last 最后装载 void slove(int i, int cV, int cW){//i 第i个物品 cV 目前最大价值 cW 目前重量 if(i >= n){//遍历完成 if(cV > MAX){//更新 MAX = cV; for(int i = 0; i < n; i++){ last[i] = x[i]; } } }else { for(int j = 0; j <=1; j++){//j = 0不装, j = 1 装 x[i] = j; if(cW + w[i]*j <= c){//更新 cW += w[i]*j; cV += v[i]*j; slove(i+1, cV, cW);//进行下一位 } } } } int main(){ ios::sync_with_stdio(false); cin >> c >> n; for(int i = 0; i < n; i++){ cin >> w[i]; } for(int i = 0; i < n; i++){ cin >> v[i]; } MAX = 0; slove(0, 0, 0); for(int i = 0; i < n-1; i++){ cout << last[i] <<" "; } cout << last[n-1] << endl<< MAX <<endl; }