题目描述
有一个箱子容量为 VVV (正整数, 0≤V≤200000 \le V \le 200000≤V≤20000 ),同时有 nnn 个物品( 0<n≤300<n \le 300<n≤30 ,每个物品有一个体积(正整数)。
要求 nnn 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入输出格式
输入格式:111 个整数,表示箱子容量
111 个整数,表示有 nnn 个物品
接下来 nnn 行,分别表示这 nnn 个物品的各自体积
输出格式:111 个整数,表示箱子剩余空间。
输入输出样例
说明
NOIp2001普及组 第4题
可以用dfs做,也可以用背包做 典型的01背包
DFS:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[111];
int t,max1 = 0,v,n;
void dfs(int k)
{
if(t > v)
return ;
if(k > n)
{
if(t > max1)
max1 = t;
return ;
}
else
{
t += a[k];
dfs(k+1);
t -= a[k];
dfs(k+1);
}
}
int main()
{
scanf("%d",&v);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
dfs(1);
printf("%d\n",v-max1);
return 0;
}
背包
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[100005];
int a[100005];
int v,n;
int main()
{
scanf("%d",&v);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
for(int i = 1; i <= n;i++)
for(int j = v;j >= a[i];j--)
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
printf("%d\n",v-dp[v]);
return 0;
}