P2066 机器分配

Aimee

一道非常水的分组背包求方案数

字典序这个东西要谨慎处理

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int dp[20][20];
int ma[20][20];
struct fr{
	int i;
}fr[20][20]; 
void dfs(int x,int y){
	if(x==0){
		return ;
	}
	dfs(x-1,fr[x][y].i);
	printf("%d %d\n",x,y-fr[x][y].i); 
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			scanf("%d",&ma[i][j]);
		}
	} 
	for(int i=1;i<=n;++i){
		for(int j=m;j>=1;--j){
			for(int z=0;z<=j;++z){
				if(dp[i-1][j-z]+ma[i][z]>=dp[i][j]){
					dp[i][j]=dp[i-1][j-z]+ma[i][z];
					fr[i][j].i=j-z;
				}
			}
		}
	}
	cout<<dp[n][m]<<endl;
	dfs(n,m); 
	return 0;
}
posted @ 2021-02-23 15:08  Simex  阅读(59)  评论(0编辑  收藏  举报