列表

详情


DP46. 装箱问题

描述

有一个箱子容量为 V ,同时有n个物品,每个物品有一个体积(正整数)。每个物品只能使用一次。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

数据范围:  ,  ,每个物品的体积满足 

输入描述

第一行输入一个正整数 V 表示箱子的容量,
第二行输入一个正整数 n 表示物品的个数。
后续 n 行每行输入一个正整数表示物品的体积    

输出描述

输出箱子最小剩余空间

示例1

输入:

24
6
8
3
12
7
9
7

输出:

0

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2022-05-18

#include<stdio.h>
int main() {
    int v,n,s[30];
    scanf("%d%d",&v,&n);
    for(int i=0;i<n;i++)
    {
       scanf("%d",&s[i]); 
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<i;j++)
        {
            if(s[i]>s[j])
            {
                int t=s[i];
                s[i]=s[j];
                s[j]=t;
            }
        }
    }
    for(int i=0;i<n;i++)
        {
            if(v>=s[i])
                v-=s[i];
        }
     printf("%d",v);
}

C 解法, 执行用时: 3ms, 内存消耗: 360KB, 提交时间: 2022-05-13

#include<stdio.h>
int main(){
    int v,n,s[30];
    scanf("%d%d",&v,&n);
    for(int i=0;i<n;i++)
        scanf("%d",&s[i]);
    for(int i=0;i<n;i++)
        for(int j=0;j<i;j++)
            if(s[i]>s[j]){
                int t=s[i];
                s[i]=s[j];
                s[j]=t;
            }
    for(int i=0;i<n;i++){
        if(v>=s[i])
            v-=s[i];
    }
        
    printf("%d",v);
}

C 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-06-23

#include <stdio.h>
#include <string.h>


int min(int x, int y)
{
    return x<=y?x:y;
}

int main()
{
    int V;
    scanf("%d",&V);//%d遇到回车换行或者空格当作结束符号,作为结束输入的标志
    int n;
    scanf("%d",&n);
    int arr[n];
    for(int i=0; i<n; i++)
    {
        scanf("%d",&arr[i]);
    }
    int dp[V+1];//dp[j]表示容量为j的时候,装入物品后剩余的最小空间
//     int dp[V+1];//dp[j]表示容量为j的时候,装入物品的最大体积数量
    for(int j=0; j<=V; j++)
    {
        dp[j] = j;
    }
    dp[0] = 0;
    
    for(int i=0; i<n; i++)
    {
        for(int j=V; j>=0; j--)
        {
            if(j >= arr[i])
            {
                dp[j] =min(dp[j],(dp[j-arr[i]]));//dp[j-arr[i]]表示选择装入arr[i]后的箱子剩余最小空间
                                                 //j-arr[i]表示装入arr[i]之前的箱子体积,该体积的箱子最小剩余空间dp[j-arr[i]]其实就是容量为j的箱子,装入arr[i]物品后的剩余最小体积相同                            
            }
        }
    }
    printf("%d",dp[V]);
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-26

#include<stdio.h>

int max(int a,int b){
	if(a>=b) return a;
	else return b;
}

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

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-03-14

#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
int main()
{
   int V,n;
    cin>>V;
    cin>>n;
    vector<int> v(n), dp(V+1,0);
    for(int i=0;i<n;i++) cin>>v[i];
//     for(int j=0;j<=V;j++) dp[j] = j;
    for(int i=0;i<n;i++)
    {
        for(int j=V;j>=v[i];j--)
        {
            dp[j] = max(dp[j], dp[j-v[i]]+v[i]);
        }
    }
    cout<<V-dp[V];
    return 0;
}

上一题