题意:
把所给出的石头分成两堆,使两堆的差最小。
思路:
这道题可以用01背包写。。也可以直接暴力。。。题上的数据范围决定了dp的效率没有暴力的高。。
代码:
#include
<
iostream
>
#include < algorithm >
#include < cstring >
#include < cmath >
using namespace std;
int a[ 23 ];
int sumAll;
int def;
void DFS( int sum, int i)
{
if (i < 0 ) return ;
int temp = abs(sumAll - 2 * sum);
if (def > temp) def = temp;
DFS(sum + a[i],i - 1 );
DFS(sum,i - 1 );
}
int main()
{
int n;
cin >> n;
memset(a, 0 , sizeof (a));
int i = 0 ;
sumAll = 0 ;
def = 0x7fffffff - 1 ;
for (;i < n;i ++ )
{
cin >> a[i];
sumAll += a[i];
}
DFS( 0 ,n - 1 );
cout << def << endl;
return 0 ;
}
#include < algorithm >
#include < cstring >
#include < cmath >
using namespace std;
int a[ 23 ];
int sumAll;
int def;
void DFS( int sum, int i)
{
if (i < 0 ) return ;
int temp = abs(sumAll - 2 * sum);
if (def > temp) def = temp;
DFS(sum + a[i],i - 1 );
DFS(sum,i - 1 );
}
int main()
{
int n;
cin >> n;
memset(a, 0 , sizeof (a));
int i = 0 ;
sumAll = 0 ;
def = 0x7fffffff - 1 ;
for (;i < n;i ++ )
{
cin >> a[i];
sumAll += a[i];
}
DFS( 0 ,n - 1 );
cout << def << endl;
return 0 ;
}