洛谷 P5322 [BJOI2019]排兵佈陣(dp,分組揹包)

傳送門


解題思路

首先很顯然的貪心是 在每個地方放置的士兵一定是某個敵人放置士兵的兩倍加一。
這樣每個地方就有s种放置方法,每種對應一個數量和一個權值,於是就成了很典型的分組揹包。

AC代碼

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<bitset>
#include<cstdio>
#include<ctime>
using namespace std;
inline int read()
{
	int f=0;
	char cc=getchar();
	while(cc<'0'||cc>'9')cc=getchar();
	while(cc>='0'&&cc<='9')f=f*10+cc-'0',cc=getchar();
	return f;
}
int s,n,m,dp[20005],a[105][105],ans;
int main(){
	s=read();
	n=read();
	m=read();
	for(int i=1;i<=s;i++){
		for(int j=1;j<=n;j++){
			a[j][i]=read();
		}
	}
	for(int i=1;i<=n;i++) sort(a[i]+1,a[i]+s+1);
	for(int i=1;i<=n;i++){
		for(int j=m;j>=0;j--){
			for(int k=1;k<=s;k++){
				if(j>=a[i][k]*2+1) dp[j]=max(dp[j],dp[j-a[i][k]*2-1]+k*i);
			}
			ans=max(ans,dp[j]);
		}
	}
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章