题目描述

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

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

输入格式

1个整数,表示箱子容量

1个整数,表示有n个物品

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

输出格式

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

输入输出样例

输入 #1
24
6
8
3
12
7
9
7
输出 #1
0

说明/提示

NOIp2001普及组 第4题

 

做一下背包问题的笔记。

题意等价于找到小于容量的最大体积,故可以将物品体积视作物品价值。这样一来,此题变成一道01背包。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;


int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int main()
{
    int m,a;
    m=read();a=read();
    int dp[m+5],mass[a];
    memset(dp,0,sizeof(dp));
    for(int i=0;i<a;i++) mass[i]=read();
    for(int i=0;i<a;i++)
        for(int j=m;j>=mass[i];j--)
            dp[j]=max(dp[j],dp[j-mass[i]]+mass[i]);
    cout<<m-dp[m];
    return 0;
}
dp