题目连接:https://www.luogu.com.cn/problem/P1489
思路:
可以开较大的二维数组,分别表示选取的血格和数量,然后选出差值最小的那个即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 220;
const int inf = 1e9+6;
int a[N],n;
bool dp[N*40][N] = {false};
int main(void)
{
scanf("%d",&n);
int sum = 0;
dp[0][0] = true;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
for(int j=4020;j>=a[i];j--)
for(int k=105;k>=1;k--)
dp[j][k] |= dp[ j-a[i] ][ k-1 ];
sum += a[i];
}
int t1 = 0,t2 = inf;
for(int j=0;j<=4020;j++)
if(dp[j][n/2] == true){
if(abs(sum - j - j) < abs(t1 - t2))
{
t1 = sum - j;
t2 = j;
}
}
if(t1 > t2) swap(t1,t2); //注意
printf("%d %d\n",t1,t2);
return 0;
}