算法训练 装箱问题

问题描述

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

输入格式

第一行为一个整数,表示箱子容量;
  第二行为一个整数,表示有n个物品;
  接下来n行,每行一个整数表示这n个物品的各自体积。

输出格式

一个整数,表示箱子剩余空间。
  样例输入
  24
  6
  8
  3
  12
  7
  9
  7

样例输出

0

思路

m[i][j]表示从1-i个物品中选择装入剩余容量为j的集装箱使得集装箱的物品重量最大
v[i]表示n个物品的重量数组

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int m[31][20001];//动态规划m[i][j]
int v[31];//表示n个物品的重量数组
//动态规划
//m[i][j]表示从1-i个物品中选择装入剩余容量为j的集装箱使得集装箱的物品重量最大
int main()
{
    int pv;
    cin>>pv;//表示集装箱的容量
    int n;
    cin>>n;//表示物品的个数
    for(int i=1;i<=n;i++)
        cin>>v[i];//输入每个物品的重量
    //计算m[1][j]
    for(int j=1;j<=pv;j++){
        if(j<v[1])
            m[1][j]=0;
        else
            m[1][j]=v[1];
    }
    //动态规m[2][j]
    for(int i=2;i<=n;i++)
        for(int j=1;j<=pv;j++){
            if(j<v[i])//如果当前容量装不下第j个物品
                m[i][j]=m[i-1][j];
            else{//如果装得下,规划出最优值
            if(m[i-1][j]>=(m[i-1][j-v[i]]+v[i]))
                m[i][j]=m[i-1][j];
            else
                m[i][j]=m[i-1][j-v[i]]+v[i];
        }
    }
    int minnum=pv-m[n][pv];//表示当前集装箱的最小剩余容量
    cout<<minnum;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值