P1049 装箱问题 dp or dfs

题目描述

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

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

输入输出格式

输入格式:

111 个整数,表示箱子容量

111 个整数,表示有 nnn 个物品

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

输出格式:

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

输入输出样例

输入样例#1: 复制
24
6
8
3
12
7
9
7
输出样例#1: 复制
0

说明

NOIp2001普及组 第4题

可以用dfs做,也可以用背包做 典型的01背包

DFS:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int a[111];
int t,max1 = 0,v,n;

void dfs(int k)
{
    if(t > v)
        return ;
    if(k > n)
    {
        if(t > max1)
            max1 = t;
            return ;
    }
    else
    {
        t +=  a[k];
        dfs(k+1);
        t -= a[k];
        dfs(k+1);
    }
}

int main()
{
    scanf("%d",&v);
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
    }
    dfs(1);
    printf("%d\n",v-max1);
    return 0;
}

背包

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[100005];
int a[100005];
int v,n;
int main()  
{
    scanf("%d",&v);
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i = 1; i <= n;i++)
        for(int j = v;j >= a[i];j--)
            dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
    printf("%d\n",v-dp[v]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liuyang981122/article/details/81513805