背包问题系列——背包问题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;
}
posted @ 2021-08-06 18:22  Akafuyu  阅读(105)  评论(0)    收藏  举报