分组背包路径记录求助
  • 板块学术版
  • 楼主wyf_sinon
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/22 14:32
  • 上次更新2024/6/22 14:53:29
查看原帖
分组背包路径记录求助
540177
wyf_sinon楼主2024/6/22 14:32

题目要求字典序最小

蒟蒻的代码只拿了20pts

#include<bits/stdc++.h>
using namespace std;
int a[16][11];
int n,m;
int dp[20];
int path[20][20];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[n+1-i][j]);//倒序 保证字典序最小
	//分组背包
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=0;j--)
		{
			for(int k=0;k<=m;k++)
			{
				if(j>=k)
				{
					if(dp[j-k]+a[i][k]>=dp[j])//等于是因为小号在后面遍历 字典序更小
					{
						dp[j]=dp[j-k]+a[i][k];
						for(int x=1;x<i;x++)  path[j][x]=path[j-k][x];//记录来时的方案
						path[j][i]=k;
					}
				}
			}
		}
	}
	printf("%d\n",dp[m]);
	for(int i=n;i>=1;i--) printf("%d %d\n",n-i+1,path[m][i]);//从1到n
}
2024/6/22 14:32
加载中...