45分茫然
查看原帖
45分茫然
410346
RegentalBread92楼主2021/8/29 18:13
#include<bits/stdc++.h>
using namespace std;
int n,a,b,f[10000005],ans=0,s=0;
int main(){
	memset(f,1e9,sizeof(f));//全部赋为超大值 
	//f[i]代表达到i时的最小翻转次数,于是f[0]设为
	//0,其余为超大值 
	f[0]=0;
	cin>>n;
	for(int i=1;i<=n;i++){//枚举1到n 
		cin>>a>>b;
		s+=a+b;//累加上下点数 
		for(int i=s;i>=0;i--){//0-1背包倒着枚举 
			if(f[i]!=1e9){//如果它没用过 
				f[i+a]=min(f[i+a],f[i]);//不翻转 
                f[i+b]=min(f[i+b],f[i]+1);//翻转 
                f[i]=1e9;//用过后设为极大值 
			}
		}
	}
	int pre=s/2;//把s/2存储下来 
	if(s%2==0){
		for(int i=0;i<pre;i++){
			ans=min(f[pre-i],f[pre+i]);
			if(ans!=1e9){//如果不是极大值 
				cout<<ans<<endl;//输出答案 
				return 0;
			}
		}
	}else{
		for(int i=1;i<=pre;i++){
			ans=min(f[pre-i+1],f[pre+i]);
			if(ans!=1e9){//如果不是极大值 
				cout<<ans<<endl;//输出答案 
				return 0;
			}
		}
	}
	return 0;
}

求答复

2021/8/29 18:13
加载中...