1272:【例9.16】分组背包

 求求你点点赞吧!拜托

 

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int v,n,t;//背包容量,物品数量,最大组号 
	cin>>v>>n>>t;
	int w[31];//物品重量 
	int c[31];//物品价值 
	int p;//组号 
	int a[11][31]={0};
	int f[11][201]={0};	
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>c[i]>>p;
		a[p][0]+=1;//第p组有多少物品 
		int q=a[p][0];
		a[p][q]=i; 
	} 
	//计算获得的最大价值

	for(int p=1;p<=t;p++) //阶段:第几组
	{
		for(int j=1;j<=v;j++)//背包容量
		{
			f[p][j]=f[p-1][j];//每个格子初始化	
			for(int i=1;i<=a[p][0];i++)
			{
				int x=a[p][i];//物品数量w数组,物品价值c数组中的索引 
				if(w[x]<=j)//能装得下
					f[p][j]=max(f[p][j], c[x]+f[p-1][j- w[x]]);
			}
		} 
	}
	cout<<f[p][v]<<endl;	
	return 0;
}

标准答案如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int v,n,t;//背包容量,物品数量,最大组号 
	cin>>v>>n>>t;
	int w[31];//物品重量 
	int c[31];//物品价值 
	int p;//组号 
	int a[11][31]={0};
	int f[201]={0};	
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>c[i]>>p;
		a[p][0]+=1;//第p组有多少物品 
		int q=a[p][0];
		a[p][q]=i; 
	} 
	//计算获得的最大价值

	for(int p=1;p<=t;p++) //阶段:第几组
	{
		for(int j=v;j>=1;j--)//背包容量
		{
			for(int i=1;i<=a[p][0];i++)
			{
				int x=a[p][i];//物品数量w数组,物品价值c数组中的索引 
				if(w[x]<=j)//能装得下
					f[j]=max(f[j], c[x]+f[j- w[x]]);
			}
		} 
	}
	cout<<f[v]<<endl;	
	return 0;
}

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值