分组背包和背包求具体方案问题结合版

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组背包和背包求具体方案问题结合版相关的知识,希望对你有一定的参考价值。

题目链接

分组背包和背包求具体方案问题结合版

  • 思路:
    因为要求是字典序,我们倒序求分组背包最终结果的最大值。
    最后得出来的最大值是f[1][m],所以现在就从该值往后面反推
  • 注意:
    求具体方案问题,状态表示需要是二维表示,对选择的组号进行区分
#include<bits/stdc++.h>
using namespace std;
const int N=12,M=18;
int f[N][M],w[N][M];
int n,m;

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) cin>>w[i][j];
		
	for(int i=n;i>=1;i--)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j] = f[i+1][j];
			for(int k=1;k<=j;k++) 
			f[i][j] = max(f[i][j],f[i+1][j-k]+w[i][k]);
		}
	}
	cout<<f[1][m]<<'\\n';//最终的结果
	int j=m;
	for(int i=1;i<=n;i++)
	{
		cout<<i<<' ';
		for(int k=1;k<=j;k++)
		{
			if(f[i][j]==f[i+1][j-k]+w[i][k]) //如果当前的最大值等于选择该物品的最优解,那么就选择该物品
			{
				cout<<k<<'\\n';
				j-=k;//每次选之后都要容量减去相对应选择的容量
				break;
			}
		}
	}
	return 0;
}

以上是关于分组背包和背包求具体方案问题结合版的主要内容,如果未能解决你的问题,请参考以下文章

[01背包] 背包问题求方案数(01背包+求方案数+求最优解方案数+思维)

[H背包] lc1449. 数位成本和为目标值的最大数字(背包求具体方案+状态定义+边界情况)

背包九讲之九:背包问题求具体方案

acwing 012 背包问题求具体方案

背包问题求具体方案

9/7 dp练习+01背包方案数+求背包具体方案