有一个箱子容量为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; }