題意:給定n個數,要求從這n個數中的選取一些數和sum大于指定數b,要求sum-b最小。
解法:剛開始可以把所有n個數全部相加得到sum,sum肯定大于b,令m=sum-b,要盡量在這m中多的減去原來在sum中的數,使得m最小;
即從這n個數種選取幾個數,使得在其和不超過m的情況下最大,這不就是一個01背包問題么。解之。
#include <stdio.h>
#include <string.h>
#define N 1000005
#define MAX(a, b)(a > b ? a : b)
int v[N], h[25];
int main()
{
int n, b, sum = 0;
scanf("%d %d", &n, &b);
for(int i = 0; i < n; i++)
{
scanf("%d", &h[i]);
sum += h[i];
}
b = sum - b;
for(int i = 0; i < n; i++)
for(int j = b; j >= h[i]; j--)
{
v[j] = MAX(v[j], v[j - h[i]] + h[i]);
}
printf("%d\n", b - v[b]);
return 0;
}