有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式:
第一行,一个整数,表示箱子容量;
第二行,一个整数,表示有n个物品;
接下来n行,分别表示这n个物品的各自体积。
输出格式:
一个整数,表示箱子剩余空间。
样例输入
24 6 8 3 12 7 9 7
样例输出
0
不了解背包问题的戳这里:
背包九讲
c++:
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[31][20001];
int main()
{
int v,n,a[31];
cin>>v>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=0;i<=v;i++)
dp[0][i]=i;//根据实际填写,dp[i][j]表示拿前i个物品在体积为j的情况下最小剩余体积
for(int i=1;i<=n;i++)//从第一个物品开始
for(int j=0;j<=v;j++)
if(j>=a[i])
dp[i][j]=min(dp[i-1][j],dp[i-1][j-a[i]]);
//第i个物品,要么放,要么不放,自己想下状态方程的原理。
else
dp[i][j]=dp[i-1][j];//如果当前最大容纳体积小于a[i],那肯定放不了
cout<<dp[n][v]<<endl;
return 0;
}