有一只容量为 V 的购物袋,同时他买了 n 件物品,已知每件物品的体积 vi 。
挑选哪些物品放入购物袋中,可以使袋子剩余的空间最小。输入格式
第一行输入一个整数 V(1≤V≤20,000),表示购物袋的容量。
第二行输入一个整数 n(1≤n≤30),表示蒜头君购买的 n 件物品。
接下来输入 n 行,每行输入一个整数 vi(1≤vi≤10,000),表示第 i 件物品的体积。
输出格式
输出一行,输出一个整数,表示购物袋最小的剩余空间。
求剩余空间最小,即求选择的物品体积之和最大
dp[i][j]表示前i件物品选若干个,放入容量为j的购物袋中,所得的最大体积
考虑第i个物品选或者不选
j-v[i]<0:
购物袋容量放不下第i个物品,第i个物品不能选
dp[i][j]=dp[i-1][j]
j-v[i]>=0:
第i个物品选:
dp[i][j]=dp[i-1][j-v[i]]+v[i]
第i个物品不选:
dp[i][j]=dp[i-1][j]
空间优化:
for(i=1;i<=N;i++)
for(j=V;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+v[i])