分组背包(相关解析及例题)

本文详细介绍了分组背包问题的概念,包括状态转移方程和三层循环的代码结构。通过实例“通天之分组背包”和“排兵布阵”展示了如何应用此算法解决实际问题。
摘要由CSDN通过智能技术生成

1.概念

分组背包:

分组背包就是有n组物品,每组物品中只可以选择一个物品。

每个物品都有体积和价值,求总体积不超过m的情况下的价值最大值。

那么我们就可以通过概念来得到状态转移方程:

dp[ j ]=max(dp[ j ],dp[ j -w[ i ][ k ] ]+v[ i ][ k ];

如果现在想不到也不要着急,马上就到了进入本文的重点

2.分组背包的思想以及相关的代码实现

分组背包是有三层循环,

第一层循环是遍历每一组

第二层循环遍历的是容量

第三层循环遍历的是组内的每一个成员

相关代码:

	//假设有t组,最大容量为m,s数组中存的是每组有多少成员
    for(int i=1;i<=t;i++)//先遍历组
	{
	     for(int j=m;j>=0;j--)//容量 
		 {
		 	for(int k=1;k<=s[i];k++)//小组中的物品
			{
			 	if(j-w[i][k]>=0)
			 	{
			 		dp[j]=max(dp[j],dp[j-w[i][k]]+v[i][k]);
				 }
			} 
		} 
	} 

3.相关例题

第一题:通天之分组背包

 

题解:就是最基础的分组背包问题,无需多言

AC代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;
int w[105][1005];//代表第i组的第j个物品的重量
int v[105][1005]; //代表第i组的第j个物品的价值
int s[105];//统计每组中有多少数
int dp[1005];//dp数组容量为j时,所能装最大价值
int t;

int main()
{
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		s[c]++;
		t=max(t,c);
		w[c][s[c]]=a;
		v[c][s[c]]=b;
	}
	for(int i=1;i<=t;i++)//先遍历组
	{
	     for(int j=m;j>=0;j--)//容量 
		 {
		 	for(int k=1;k<=s[i];k++)//小组中的物品
			{
			 	if(j-w[i][k]>=0)
			 	{
			 		dp[j]=max(dp[j],dp[j-w[i][k]]+v[i][k]);
				 }
			} 
		} 
	} 
	printf("%d",dp[m]);
	return 0;
}

 第二题:排兵布阵

 

题解:

我们可以把每个城堡看做一组物品。每个人的兵看成体积,把城堡编号看成价值。

但是难点分组背包是每一个组只能选一个,这里是可以打多个对手。

其实可以发现,假设第i个对手派出的兵<第i+1个对手派出的兵,那么如果我们派出的兵可以打赢i+1个对手派出的兵,那么也肯定能打赢第i个对手。

所以,我们可以把每个城堡分别的对手派出的兵数进行排序。状态转移的时候,把分组背包的枚举哪一个物品改成从小到打枚举哪几个物品,这样就可以转化为分组背包。

请看AC代码:

#include<bits/stdc++.h>
using namespace std;
 
int s,n,m;
int dp[20005];
int a[105][105];
int main()
{
	scanf("%d%d%d",&s,&n,&m);
	for(int i=1;i<=s;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&a[j][i]);
		}
	}for(int i=1;i<=n;i++)
	sort(a[i]+1,a[i]+s+1);
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=0;j--)
		{
			for(int k=1;k<=s;k++)
			{
				if(j-2*a[i][k]>0)
				{
					dp[j]=max(dp[j],dp[j-2*a[i][k]-1]+i*k);
				}
			}
		}
	}
	printf("%d",dp[m]);
	return 0;
}

 

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个因子分析的 SPSS 实验例题解析: 假设你在进行一项市场研究,想要了解顾客对某个品牌的态度。你设计了一个问卷,其中包含了 20 个问题,每个问题都是用 7 级量表回答(1表示非常不同意,7表示非常同意)。问题包括以下内容: 1. 我认为这个品牌具有高品质的产品。 2. 我对这个品牌的可靠性很满意。 3. 这个品牌的产品给我的感觉非常好。 4. 我喜欢这个品牌的广告。 5. 我觉得这个品牌的价格非常合理。 6. 这个品牌的经销商非常专业。 7. 我认为这个品牌的产品性价比很高。 8. 我对这个品牌的声誉非常满意。 9. 我觉得这个品牌的产品很时尚。 10. 我对这个品牌的服务很满意。 11. 我觉得这个品牌已经在市场上拥有了良好的地位。 12. 这个品牌的产品设计非常好。 13. 这个品牌的产品很容易使用。 14. 我认为这个品牌有很好的品牌形象。 15. 我觉得这个品牌的产品很实用。 16. 我喜欢这个品牌的宣传。 17. 我认为这个品牌的产品很有质量。 18. 我觉得这个品牌的产品很适合我。 19. 这个品牌的广告很有趣。 20. 我认为这个品牌的产品具有创新性。 你想要对这些问题进行因子分析,以确定它们是否可以归为几个共同的因素。你打开 SPSS,输入数据并进行分析。 解析: 1. 首先,打开 SPSS,点击“Analyze”菜单,选择“Factor”并点击“Descriptive”选项,进入到因子分析的分析界面。 2. 在“Descriptive”选项卡中,将所有 20 个问题添加到“Variables”窗口中。这可以通过选择问题并点击“Add”按钮来完成。 3. 在“Extraction”选项卡中,选择“Principal components”方法,并勾选“Eigenvalues greater than 1”选项,这将确保只有因子的特征值大于 1 才被选择。 4. 在“Rotation”选项卡中,选择“Varimax”旋转方法。这将确保因子在变量之间具有最大的独立性。 5. 最后,点击“OK”按钮,SPSS 将生成因子分析的结果。这将包括因子的特征值、因子载荷、每个问题的因子得分和因子贡献度等信息。 通过分析结果,你可以确定这 20 个问题可以被分为 4 个共同的因素,分别是“品牌形象”、“产品质量”、“产品价格”和“市场地位”。这些因子可以帮助你更好地了解顾客对品牌的态度和看法,从而为品牌的市场营销策略提供更有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值