[dfs||01背包] 洛谷P2392

题目

[dfs||01背包] 洛谷P2392_第1张图片

思路1

题上可以分两组,
dfs跑所有情况,取最小的最大值。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if __cplusplus >= 201103L
#include 
#include 
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
bool vis[100];
int res=INF,ans=0;
int a[10],b[100];
void dfs(int sum,int now,int n){
	res=min(max(sum,ans-sum),res);
	if(now==n+1) return;
	dfs(sum,now+1,n);
	dfs(sum+b[now],now+1,n);
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	for(int i=1;i<=4;i++) cin>>a[i];
	int ans1=0;
	for(int i=1;i<=4;i++){
		//cout<
		memset(b,0,sizeof b);
		for(int j=1;j<=a[i];j++){
			cin>>b[j];
			ans+=b[j];
		}
		dfs(0,1,a[i]);
		ans1+=res;
	//	cout<
		res=INF;
		ans=0;
	}
	cout<<ans1<<endl;
    return 0;
}

思路2

体积为m/2的01背包

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if __cplusplus >= 201103L
#include 
#include 
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
bool vis[100];
int res=INF,ans=0;
int a[10],b[100],dp[600];
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	for(int i=1;i<=4;i++) cin>>a[i];
	int ans1=0;
	for(int i=1;i<=4;i++){
		int m=0;
		memset(b,0,sizeof b);
		memset(dp,0,sizeof dp);
		for(int j=1;j<=a[i];j++){
			cin>>b[j];
			m+=b[j];
		}
		for(int j=1;j<=a[i];j++){
			for(int k=m/2;k>=b[j];k--){
				dp[k]=max(dp[k],dp[k-b[j]]+b[j]);
			}
		}
		ans1+=max(dp[m/2],m-dp[m/2]);
		//cout<
	}
	cout<<ans1<<endl;
    return 0;
}

你可能感兴趣的:([dfs||01背包] 洛谷P2392)