Yurchiu's Blog

求方案类背包问题题解 II

Yurchiu 2020-02-01, 10:53:47 534 隐藏左右两栏 展示左右两栏

本文为大型题解集

P2066 机器分配
P1759 通天之潜水

P2066 机器分配

这道题的难点在于要输出分配方案。

CODE

#include<bits/stdc++.h> 
using namespace std;
struct st
{
	int s[200];	
}ans[200][200];
int n,m,c[200][200],f[200][200]; 
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&c[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=0;j<=m;j++)
			for(int k=0;k<=m;k++)
				if(j>=k&&f[i][j]<=f[i-1][j-k]+c[i][k])
				{
					f[i][j]=f[i-1][j-k]+c[i][k];
					ans[i][j]=ans[i-1][j-k];
					ans[i][j].s[i]=k;
				}
	printf("%d\n",f[n][m]);
	for(int i=1;i<=n;i++)
		printf("%d %d\n",i,ans[n][m].s[i]);
	return 0;
}

只是多了一个ans[][]结构体数组而已!

思路

ans[][]的转移方式与f[][]相似。

即,若f[i][j]<=f[i-1][j-k]+c[i][k](懒得表述),则ans[i][j]=ans[i-1][j-k]+k!这样就记录了方案选择。只是为了方便,使用结构体。

时间复杂度:O(nm2)O(nm^2)

P1759 通天之潜水

CODE

#include<bits/stdc++.h>
using namespace std;
struct my
{
	int a[200+5],cnt;
}ans[200+5][200+5];
int n,m1,m2,w1[100+5],w2[100+5],c[100+5],f[200+5][200+5];
int main()
{
	scanf("%d%d%d",&m1,&m2,&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",w1+i,w2+i,c+i);//二维费用,状态数组加一维。
	for(int i=1;i<=n;i++)
		for(int j1=m1;j1>=w1[i];j1--)
			for(int j2=m2;j2>=w2[i];j2--)
				if(f[j1][j2]<f[j1-w1[i]][j2-w2[i]]+c[i])
				{
					f[j1][j2]=f[j1-w1[i]][j2-w2[i]]+c[i];
					ans[j1][j2]=ans[j1-w1[i]][j2-w2[i]];
					ans[j1][j2].a[++ans[j1][j2].cnt]=i;
				}
	printf("%d\n",f[m1][m2]);
	for(int i=1;i<=ans[m1][m2].cnt;i++)
		printf("%d ",ans[m1][m2].a[i]);
	return 0;
}

ans[][]的记录方式仍是类似的。

请注意,这个code与机器分配的code相比,有优化(滚动数组)。尝试对机器分配的code进行优化。





本文作者:Yurchiu

本文链接:https://yz-hs.github.io/c2db6b6b3456/

版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。


By Yurchiu.
其他物件杂物收纳
Hitokoto

Yurchiu 说,除了她以外的人都很强!嘤嘤嘤~~
博客信息
文章数目
158
最近更新
08-21
本站字数
350.6k
文章目录