Fancy Mouse
- -|||
问题的本质是对于4个数组,每一个数组求一个分拆使两部分差最小。典型的DP。不过当时做的时候DP还学得不咋地,所以还是用搜索的办法~~还好也ac了
#include<iostream>
using namespace std;

int data[20],sum,min;
void DFS(long item,int items,int curmin);
int main()
{
    
int s[4],i,j;
    
long result;
    
while(cin>>s[0]>>s[1]>>s[2]>>s[3])
    
{
        result 
= 0;
        
for(i=0;i<4;i++)
        
{
            sum 
= 0;
            
for(j=0;j<s[i];j++)
            
{
                cin
>>data[j];
                sum 
+= data[j];
            }

            min 
= sum;
            DFS(
0,s[i]-1,sum);
            result 
+= min;
        }

        cout
<<result<<endl;
    }

}

void DFS(long item,int items,int curmin)
{
    
if(items < 0)
    
{
        
if(min>curmin) min = curmin;
        
return;
    }

    DFS(item,items
-1,curmin);
    item 
+= 1<<items;
    
int temp = curmin - data[items];
    
if(temp >= (sum+1)/2)
        DFS(item,items
-1,temp);
}
此题与1017类似。数据加强版是1166
posted on 2005-10-22 02:29  Fancy Mouse  阅读(384)  评论(1编辑  收藏  举报