背包问题系列——背包问题1
问题描述
一个背包容积为\(T(0 \leq T \leq 2000)\), 现在有 \(N(0 \le N \leq 1000)\)个物品,每个物品有一定体积\(V(1 \leq V \leq 5000)\)。从这N个物品中选取若干个装入背包内,使背包所剩的空间最小。请求出最小的剩余空间?
输入格式
第一行,空格间隔的两个整数T和N,分别表示背包的容积和物品的个数。
第二行,用空格间隔的N个整数,表示每个物品的体积。
输出格式
只有一行,一个整数,表示最小剩余的背包空间。
样例输入
30 4
15 8 13 6
样例输出
1
简单01背包,不说了。
#include <bits/stdc++.h>
using namespace std;
#define MAXN 2005
int w[MAXN];
int dp[MAXN];
int main()
{
int T, N;
scanf("%d %d", &T, &N);
for(int i = 1; i <= N; i++)
scanf("%d", &w[i]);
memset(dp, -0x3f, sizeof(dp));
dp[0] = 0;
for(int i = 1; i <= N; i++)
{
for(int j = T; j >= w[i]; j--)
{
dp[j] = max(dp[j], dp[j - w[i]] + w[i]); //这里把体积看作价值
}
}
int ans = 0;
for(int i = 1; i <= T; i++)
ans = max(ans, dp[i]);
printf("%d\n", T - ans); //注意这里输出的是最小剩余的背包空间
return 0;
}

浙公网安备 33010602011771号