描述
有一个箱子容量为 v(0<=v<=20000),同时有 n 个物品(1<=n<=30),每个物品有一个体积。
要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间最小。请计算并输出最小的剩余空间。
输入
第一行是一个整数 v (0<=v<=20000) 表示箱子容量。
第二行是一个整数 n (1<=n<=30) 表示物品数量。
接下来 n 行,每行一个正整数(不超过10000),分别表示这 n 个物品各自的体积。
输出
一个整数,表示箱子最小剩余空间。
样例输入
24 6 8 3 12 7 9 7
样例输出
0
题解如下
解法1
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int v[1086][1086],m[100000];
int main(){
int z,n;
cin>>z>>n;
for(int i=1;i<=n;i++){
cin>>m[i];
}
for(int i=1;i<=n;i++){
for(int j=z;j;j--){
if(j>=m[i]){
v[i][j]=max(v[i-1][j-m[i]]+m[i],v[i-1][j]);//状态转移
}else{
v[i][j]=v[i-1][j];//如果不能拿就继承上一次状态
}
}
}
int maxx=z-v[n][z];
cout<<maxx;
}
解法2
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int m,n;
int dis[500005];
int f[20005][55];
int dfs(int i,int j){
if(!j) return 0;
if(f[i][j]) return f[i][j];
int ce=0;
if(i>=dis[j]){
ce=max(dfs(i,j-1),dfs(i-dis[j],j-1)+dis[j]);//状态转移
}else{
ce=dfs(i,j-1);//不能拿就继承状态
}
f[i][j]=ce;
return f[i][j];
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>dis[i];
}
cout<<m-dfs(m,n);
}