分组背包
一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
输入格式
第一行:三个整数,V(背包容量,V<=200),N(物品数量,N<=30)和T(最大组号,T<=10);
第2..N+1行:每行三个整数Wi,Ci,P,表示每个物品的重量,价值,所属组号。
输出格式
仅一行,一个数,表示最大总价值。
样例
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
20
用一个二维数组存每个数的组数和每组第几个数
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
const int maxw=1010;
int n=0,m=0;
int f[maxw];
int v[maxn];
int w[maxn];
int g[maxn][maxn];
int num;
void bag(int n,int m){
for(int i=1;i<=num;i++){//确保每组只取一个
for(int j=m;j>=0;j--){
for(int k=1;k<=g[i][0];k++){
if(j>=v[g[i][k]]){
int x=g[i][k];
f[j]=max(f[j],f[j-v[x]]+w[x]);
}
}
}
}
}
int main(){
int num1;
cin>>m>>n>>num;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i]>>num1;
g[num1][++g[num1][0]]=i;//第一维用来存第几组,第二维存第几组第几个数,整体用来存下标
}
bag(n,m);
cout<<f[m];
}

浙公网安备 33010602011771号