P1049 装箱问题(背包)

题目描述

有一个箱子容量为VV(正整数,0 \le V \le 200000V20000),同时有nn个物品(0<n \le 300<n30,每个物品有一个体积(正整数)。

要求nn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入格式

11个整数,表示箱子容量

11个整数,表示有nn个物品

接下来nn行,分别表示这nn个物品的各自体积

输出格式

11个整数,表示箱子剩余空间。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int dp[maxn];
int n;
int c[maxn];
int v;
int main () {
    scanf("%d%d",&v,&n);
    for (int i=1;i<=n;i++) scanf("%d",c+i);
    for (int i=1;i<=n;i++) {
        for (int j=v;j>=c[i];j--)
            dp[j]=max(dp[j],dp[j-c[i]]+c[i]);
    }
    int ans=0;
    for (int i=0;i<=v;i++) if (dp[i]<=v) ans=max(ans,dp[i]);
    printf("%d",v-ans);
}

 

posted @ 2020-08-07 16:04  zlc0405  阅读(78)  评论(0编辑  收藏  举报