鉴于一个最多100个芯片的包,每个芯片都有它的值。 确定两个人之间最公平的分工。这意味着每个人获得的金额之间的差异应该最小化。筹码的价值从1到1000不等。
输入:硬币的数量m,以及每枚硬币的价值。
输出:两个人从相应的包中分割筹码时获得的最小正差。
我发现很难为它形成DP解决方案。请帮帮我。
最初我不得不尝试将它作为非DP解决方案。实际上我还没有想过用DP解决它。我只是对值数组进行了排序。并将最大值分配给其中一个人,并将其他值逐渐分配给两个中的一个,具体取决于哪个创建最小差异。但该解决方案实际上并没有奏效。
我在这里发布我的解决方案:
bool myfunction(int i,int j)
{
return(i >= j) ;
}
int main()
{
int T, m, sum1, sum2, temp_sum1, temp_sum2,i ;
cin >> T ;
while(T--)
{
cin >> m ;
sum1 = 0 ; sum2 = 0 ; temp_sum1 = 0 ; temp_sum2 = 0 ;
vector<int> arr(m) ;
for(i=0 ; i < m ; i++)
{
cin>>arr[i] ;
}
if(m==1 )
{
if(arr[0]%2==0)
cout<<0<<endl ;
else
cout<<1<<endl ;
}
else {
sort(arr.begin(), arr.end(), myfunction) ;
// vector<int> s1 ;
// vector<int> s2 ;
for(i=0 ; i < m ; i++)
{
temp_sum1 = sum1 + arr[i] ;
temp_sum2 = sum2 + arr[i] ;
if(abs(temp_sum1 - sum2) <= abs(temp_sum2 -sum1))
{
sum1 = sum1 + arr[i] ;
}
else
{
sum2 = sum2 + arr[i] ;
}
temp_sum1 = 0 ;
temp_sum2 = 0 ;
}
cout<<abs(sum1 -sum2)<<endl ;
}
}
return 0 ;
}
答案 0 :(得分:0)
我从你的问题中理解的是你想要将筹码分成两个人,以便最大限度地减少写在这些筹码上的数字之和的差异。 如果理解是正确的,那么您可以按照以下方法找到解决方案。
如果我对问题的理解是正确的,那么此解决方案应该可以解决您的问题。
酌情反思。
由于
拉温德拉