题目描述
一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int max_n= 50;
const int max_v = 250;
//分别表示背包最大负重,物品个数,小组个数
int max_w,n,g;
//bag[i][j]:表示第i组的第j个物品对应的w,v,数组的标识符index
vector<int> bag[max_n];
// f[i] 背包剩余负重为i时的,最大的价值
int f[max_v];
int w[max_n],v[max_n];
int main(){
cin >> max_w >> n >> g ;
memset(f,0,sizeof max_w);
for(int i=1;i<=n;i++){
int p ;
cin >> w[i] >> v[i] >> p;
bag[p].push_back(i);
}
for(int i=1;i<=n;i++){
for(int k=max_w;k>0;k--){
for(int j=0;j<bag[i].size();j++){
int p = bag[i][j];
if(k >= w[p])
f[k] = max(f[k],f[k-w[p]]+v[p]);
}
}
}
cout << f[max_w] << endl;
return 0;
}
//#include<iostream>
//#include<cstdio>
//#include<cstring>
//#include<vector>
//using namespace std;
//int v,n,t;
//const int maxn = 50;
//const int maxv = 250;
//vector<int> bag[maxn];
//int w[maxn],val[maxn];
//int f[maxv];
//void solve(){
// memset(f,0,sizeof f);
// for(int i = 1;i <= t;i++){
// for(int k = v;k > 0;k--){
// for(int j = 1;j <= bag[i].size();j++){
// int p = bag[i][j-1];
// if(k >= w[p])
// f[k] = max(f[k],f[k-w[p]]+val[p]);
// }
// }
// }
// printf("%d\n",f[v]);
//}
//int main(){
//
// while(scanf("%d%d%d",&v,&n,&t)!=EOF){
// for(int i = 1;i <= n;i++){
// int p;
// scanf("%d%d%d",&w[i],&val[i],&p);
// bag[p].push_back(i);
// }
// solve();
// }
// return 0;
//}