装箱问题的三种解法

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

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

样例
输入样例
复制代码
24
6
8
3
12
7
9
7
输出样例
复制代码
0

方法一:动规

dp[j]表示体积为j用掉的最大体积

动态转移方程:dp[j]=max(dp[j],dp[j-a[i]]+a[i]);

dp[j-a[i]]+a[i]表示a[i]全部装入

dp[j]表示不放入

cs 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int V,n,i,j;
	cin>>V>>n;
	int a[35]={};
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	int dp[20005]={};
	for(i=0;i<n;i++){
		for(j=V;j>=a[i];j--){
			dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
		}
	}
	cout<<V-dp[V]<<endl;
} 

方法2 回溯

cs 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[35]={}; 
//maxV表示消耗的最大体积 
int maxV=0,n,V;
//sumV为实际消耗的体积 
//cnt为搜索的第cnt个物品 
void dfs(int cnt,int sumV){
	if(sumV>V)return;
	//搜索到最后一个 
	if(cnt==n+1){
		if(sumV>maxV)maxV=sumV;
		return; 
	}
	//不放入 
	dfs(cnt+1,sumV);
	//全部放入 
	dfs(cnt+1,sumV+a[cnt]);
}
int main(){
	cin>>V;
	int i,j;
	cin>>n; 
	for(i=0;i<n;i++){
		cin>>a[i]; 
	}
	dfs(0,0);
    cout<<V-maxV<<endl;
} 

方法3 贪心

从大到小排序,每次选择可以装入的

cs 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
//从大到小排序 
int cmp(const void *a,const void *b){
	return *(int*)b-*(int*)a;
} 
int main(){
	int V,n,i,j;
	cin>>V>>n;
	int a[35]={};
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	qsort(a,n,sizeof(int),cmp);
	for(i=0;i<n;i++){
		if(V==0)break;
		if(V>=a[i])V-=a[i]; 
	}
	cout<<V<<endl; 
} 

这样子有局限性,只有数组最大值放入能够使剩余空间最小才满足。

举个例子

数组最大值放入反而得不到剩余空间最小值

用动态规划和回溯均可得到最小剩余空间为0。可见这个贪心策略有局限性。

相关推荐
诸葛务农7 分钟前
光电对抗:多模复合制导烟雾干扰外场试验及仿真(4)
人工智能·算法·光电对抗
WolfGang00732116 分钟前
代码随想录算法训练营 Day39 | 动态规划 part12
算法·动态规划
网域小星球27 分钟前
C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)
开发语言·c++·面试·静态成员·友元函数
阿Y加油吧29 分钟前
动态规划经典题解:最长递增子序列 & 乘积最大子数组
算法·动态规划·代理模式
|_⊙29 分钟前
C++11 右值引用
开发语言·c++
李昊哲小课34 分钟前
WSL Ubuntu 24.04 GPU 加速环境完整安装指南
c++·pytorch·深度学习·ubuntu·cuda·tensorflow2
Byte不洛36 分钟前
C++继承详解(菱形继承与虚拟继承)
c++·继承·面向对象·菱形继承·虚拟继承
f3iiish36 分钟前
3783. 整数的镜像距离 力扣
算法·leetcode
Not Dr.Wang42239 分钟前
基于matlab的控制系统奈氏图及其稳定性分析
数据结构·算法·matlab
闻缺陷则喜何志丹1 小时前
【排序 离散化 二维前缀和】 P7149 [USACO20DEC] Rectangular Pasture S|普及+
c++·算法·排序·离散化·二维前缀和