题目描述 Description
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入描述 Input Description
一个整数v,表示箱子容量
一个整数n,表示有n个物品
接下来n个整数,分别表示这n 个物品的各自体积
输出描述 Output Description
一个整数,表示箱子剩余空间。
样例输入 Sample Input
24
6
8
3
12
7
9
7
样例输出 Sample Output
0
数据范围及提示 Data Size & Hint
深搜加记忆化搜索
#include <iostream>
#include <cstdio>
using namespace std;
int map[31]={0};
int vis[31]={0};
int n;
int value;
int maxx=-1;
int check(){
int s=0;
for(int i=0;i<n;i++)
if(vis[i])
s+=map[i];
return s;
}
void dfs(int x){
int sum=check();
if(sum<=value){
if(maxx<sum)
maxx=sum;
}
else
return ;
if(x<n){
vis[x]=1;
dfs(x+1);
vis[x]=0;
dfs(x+1);
}
}
int main(){
scanf("%d%d", &value, &n);
for(int i=0;i<n;i++)
scanf("%d", &map[i]);
dfs(0);
printf("%d\n", value-maxx);
return 0;
}