T1272:【例9.16】分组背包

【题目描述】
一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,CnC1,C2,…,Cn。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

【输入】
第一行:三个整数,V(背包容量,V≤200),N(物品数量,N≤30)和T(最大组号,T≤10);

第2…N+1行:每行三个整数Wi,Ci,PWi,Ci,P,表示每个物品的重量,价值,所属组号。

【输出】
仅一行,一个数,表示最大总价值。

【输入样例】
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
【输出样例】
20

此题为分组背包的应用,第一次根据模板写写错了(可能是太依赖于模板了叭),然后在网上看了dalao们的代码,发现group数组用的真好!注意group数组的应用,注释在代码里面哟~

#include
#include
#include
#include
using namespace std;
int W,N,T,i,j,k;
int w[1005],c[1005],p,dp[1005];
int group[1005][1005];
int main()
{
	//freopen("1272.in","r",stdin);
	//freopen("1272.out","w",stdout);
	scanf("%d %d %d",&W,&N,&T);
	memset(dp,0,sizeof(dp));
	memset(group,0,sizeof(group));
	for(i=1;i<=N;i++)
	{
		cin>>w[i]>>c[i]>>p;        //group[p][0]存储p组元素的个数,同时group数组的第二维是组内的数量
		group[p][++group[p][0]]=i; // 数组的值等于物品的数量 ,相当于group[1][1]=1;group[1][2]=2;group[1][0]=2; 
	}                              //group[2][1]=3;group[2][2]=4;group[1][0]=2;	                      
	for(i=1;i<=T;i++)              //group[3][1]=5;group[3][2]=6;group[1][0]=2;	         
	{                             
		for(j=W;j>=0;j--)//底下有个if语句控制 
		{
			for(k=1;k<=group[i][0];k++)
			{
				int q=group[i][k];//q为第几个物品 
				if(j>=w[q])
				dp[j]=max(dp[j],dp[j-w[q]]+c[q]);
			}
		}
	}
	printf("%d\n",dp[W]);
}

你可能感兴趣的:(信息学奥赛一本通)