美文网首页动态规划
GYM101061F(Fairness-dfs||dp)

GYM101061F(Fairness-dfs||dp)

作者: 雨落八千里 | 来源:发表于2019-07-24 16:29 被阅读0次

Fairness

题意:
  • 老父亲给两个儿子分钱,在分钱的过程中尽可能的将钱的差值尽可能的小
思路1:
  • 采用dfs将所有的分钱方式都列举出来,并在列举过程中进行比较(剪枝)。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int a[110];
int n,maix;
void dfs(int pos,int d,int s,int cnt)
{
   int count=abs(d-s);//计算当前这一次的差值
   if(cnt>=maix)//比较过程中最大值差值与最终的差值,假如比最终的差值都大,说明这一次分钱已经没有意义
   {
       return ;
   }
   if(pos>n)//当钱都分完了,最终的差值就是过程中的最大差值
   {
       maix=cnt;
       return ;
   }
   if(count>cnt)//当前差值与过程中的最大差值作比较
   {
       cnt=count;
   }
   pos++;
   dfs(pos,d+a[pos],s,cnt);
   dfs(pos,d,s+a[pos],cnt);
   return ;
}
int main( )
{
   int t;
   scanf("%d",&t);
  while(t--)
   {
       cin>>n;
       for(int i=1;i<=n;i++)
       {
           cin>>a[i];
       }
       maix=INF;
       dfs(1,a[1],0,0);
       cout<<maix<<endl;
   }
   return 0;
}
思路2:
  • dp[i][j]表示前i枚硬币中两人所得硬币总面额差值为j时的的最小差值,那么对于第i枚硬币有两种情况,给第一个人和给第二个人,进而有两种转移:
    dp[i][j+a[i]]=min(dp[i][j+a[i]],max(dp[i-1][j],abs(j+a[i]))
    dp[i][j-a[i]]=min(dp[i][j-a[i]],max(dp[i-1][j],abs(j-a[i]))
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int dp[110][10010];
int a[110];
int n;
int main( )
{
   int t;
   cin>>t;
   while(t--)
   {
       cin>>n;
       for(int i=1;i<=n;i++)
       {
           cin>>a[i];
       }
       for(int i=0;i<=n;i++)
       {
           for(int j=0;j<=20000;j++)
           {
               dp[i][j]=INF;
           }
       }
       dp[0][10000]=0;
       for(int i=1;i<=n;i++)
       {
           for(int j=0;j<=20000;j++)
           {
               if(dp[i-1][j]!=INF)
               {
                   dp[i][j+a[i]]=min(dp[i][j+a[i]],max(dp[i-1][j],abs(j+a[i]-10000)));
                   dp[i][j-a[i]]=min(dp[i][j-a[i]],max(dp[i-1][j],abs(j-a[i]-10000)));

               }
               
           }
       }
       int ans=INF;
       for(int i=0;i<=20000;i++)
       {
           ans=min(dp[n][i],ans);
       }
       cout<<ans<<endl;
   }
   return 0;
}

相关文章

网友评论

    本文标题:GYM101061F(Fairness-dfs||dp)

    本文链接:https://www.haomeiwen.com/subject/fqnxrctx.html