0/1背包问题。给定一载重量为W的背包及n个重量为wi、价值为vi的物体,1≤i≤n,要求而且重量和恰好为W具有最大的价值。
输入格式:
第一行输入背包载重量W及背包个数n,再依次输入n行,每行为背包重量wi和价值vi。
输出格式:
第一行输出装入背包内的物体编号(末尾有空格),若没有任何物品能装入,输出: No,第二行输出背包内的物体总价值。
输入样例1:
5 10
2 6
2 3
6 5
5 4
4 6
结尾无空行
输出样例1:
1 2 5
15
结尾无空行
输入样例2:
2 10
11 2
13 100
结尾无空行
输出样例2:
No
0
结尾无空行
知识点:vector<vector> ps 用来存放幂集,vector<vector> ps1用于存放字串,迭代器vector<vector>::iterator it,用于遍历幂集中的集合,vector::iterator t,用于遍历集合中的元素。
思路:求出这几个数的幂集,然后根据集合中的每一个集合救出sumw,sumv,然后与maxw,maxv比较求出最大maxv即先求出幂集,然后遍历每一个集合求出sumw,sumv与maxw,maxv比较确定maxv
注:也可以用二进制进行求解,
源码:
#include<bits/stdc++.h>
using namespace std;
int n, maxw,maxv=0;
int v[101];
int w[101];
vector<vector<int>> ps;
vector<int>::iterator r;
vector<vector<int>> ::iterator t;
void power() {
vector<vector<int>> ps1;
vector<vector<int>>::iterator it;
vector<int> s;
ps.push_back(s);
for (int i = 1;i <= n;i++) {
ps1 = ps;
for (it= ps1.begin();it != ps1.end();it++) {
(*it).push_back(i);
}
for (it = ps1.begin();it != ps1.end();it++)
ps.push_back(*it);
}
}
void juddge() {
vector<vector<int>>::iterator it;
vector<int> :: iterator pt;
t = ps.end();
for (it = ps.begin();it !=ps.end();it++) {
int sumv = 0;
int sumw = 0;
for (pt = (*it).begin();pt != (*it).end();pt++) {
if (sumw + w[*pt] <= maxw) {
sumw += w[*pt];
sumv += v[*pt];
if (sumv > maxv) {
maxv = sumv;
t = it;
}
}
}
}
}
int main() {
cin >> n >> maxw;
for (int i = 1;i <= n;i++) {
cin >> w[i] >> v[i];
}
power();
juddge();
if (t == ps.end()) {
cout << "No"<<endl;
cout << "0" << endl;
}
else {
for (r = (*t).begin();r != (*t).end();r++) {
cout << *r << " ";
}
cout << endl;
cout << maxv;
}
}