[Acwing] 1013. 机器分配 分组背包+路径输出

前言

对我来说感觉不应是绿色啊。。

传送门 :

思路

选 j j j台的机器抽象成体积,然后直接跑一遍分组背包

但是这个路径输出怎么办呢

。。拓扑的直接dfs

我们可以从后往前dfs求出终点状态是从哪一个状态转移过来的

然后我们在网上继续dfs

CODE

// Problem: 混合背包问题
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/7/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// Problem: P2738 [USACO4.1]���ʻ�·Fence Loops
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2738
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define px first
#define py second
#define pb push_back
typedef pair<int,int> pii;
int dxy[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
const int N  = 30;



struct union_find_set{
    int n,p[N];

    void init(int N)
    {
        n = N;
        for(int i=1;i<=n;i++)
        p[i] = i ;
    }

    int find(int x)
    {
        if(p[x]!=x)return p[x] =find(p[x]);
        return p[x];
    }

    bool set_union(int u,int v)
    {
        return (u = find(u)) ==(v == find(v))?false : p[v] = u ;

    }
}ufs;

int n,m,t;

int f[N][N];
int w[N][N];

int path[N],idx;



void cal()
{

}

void dfs(int i,int j)
{
	if(!i)
	return;
	for(int p = 0 ;p<=j;p++)
	{
		//找从哪个状态转移过来的
		if(f[i-1][j-p] + w[i][p] == f[i][j])
		{
			path[idx++] = p;
			dfs(i-1,j-p);
			return;
		}
	}
}
void solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		cin>>w[i][j];
	
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int k = 0 ;k<=j;k++)
			f[i][j] = max(f[i][j] ,f[i-1][j-k]+w[i][k]);
	
	cout<<f[n][m]<<endl;
	dfs(n,m);
	for(int i = idx - 1, id = 1;i>=0;i--,++id)
	{
		cout<<id<<" "<<path[i]<<endl;
	}

}

int main()
{
    ios::sync_with_stdio(false);
    solve();
    return 0;
}
上一篇:Using 1 worker with 2048MB memory limit 异常


下一篇:redis client-output-buffer-limit 设置