洛谷 P2392 kkksc03考前临时抱佛脚dp/搜索

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码实现
  • 总结


题目链接

链接: P2392 kkksc03考前临时抱佛脚

题目描述

洛谷 P2392 kkksc03考前临时抱佛脚dp/搜索_第1张图片

解题思路

dp或者搜索

代码实现

01背包二维版本

#include
#include
#include
using namespace std;
const int N=25;
int f[N][2000];//只考虑前i个题,使用j 题目时间小于j 消耗最长时间 
int s[4],res=0;
int a[N];
int main()
{
   ios::sync_with_stdio(0);
   cin.tie(0),cout.tie(0);
   int T=4;
   for(int i=0;i<4;i++) cin>>s[i];
   while(T--)
   {
       int n=s[4-T-1];
       int sum=0; 
   	   for(int i=1;i<=n;i++){
   	     	cin>>a[i];
   	     	sum+=a[i];
	   } 
   	   for(int i=1;i<=n;i++)
   	   {
   	      for(int j=0;j<=sum/2;j++)
        	 {
        	     f[i][j]=f[i-1][j];
        	     if(j>=a[i])
		   	 	 f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]);
		     } 	
	   }
	   res+=sum-f[n][sum/2];
   }
   cout<

一维版本

#include
#include
#include
using namespace std;
const int N=25;
int f[2000];//只考虑前i个题,使用j 题目时间小于j 消耗最长时间 
int s[4],res=0;
int a[N];
int main()
{
   ios::sync_with_stdio(0);
   cin.tie(0),cout.tie(0);
   int T=4;
   for(int i=0;i<4;i++) cin>>s[i];
   while(T--)
   {
       int n=s[4-T-1];
       int sum=0; 
   	   for(int i=1;i<=n;i++){
   	     	cin>>a[i];
   	     	sum+=a[i];
	   } 
   	   for(int i=1;i<=n;i++)
   	   {
   	      for(int j=sum/2;j>=a[i];j--)
        	 {
		   	 	 f[j]=max(f[j],f[j-a[i]]+a[i]);
		     } 	
	   }
	   res+=max(f[sum/2],sum-f[sum/2]);
	   memset(f,0,sizeof f);
   }
   cout<<res;
   return 0;	
}

搜索

#include
using namespace std;
int Left,Right,minn,ans;
int s[5];
int a[21][5];
void search(int x,int y){
	if(x>s[y]){
		minn=min(minn,max(Left,Right));
		return;
	}
	Left+=a[x][y];
	search(x+1,y);
	Left-=a[x][y];
	Right+=a[x][y];
	search(x+1,y);
	Right-=a[x][y];//毫无技巧的搜索回溯
}
int main(){
	cin>>s[1]>>s[2]>>s[3]>>s[4];
	for(int i=1;i<=4;i++){//减少码量
		Left=Right=0;
		minn=19260817;
		for(int j=1;j<=s[i];j++)
			cin>>a[j][i];
		search(1,i);
		ans+=minn;
	}
	cout<<ans;
	return 0;
}

总结

你可能感兴趣的:(搜索,洛谷,算法,c++,深度优先)