【动态规划】01背包问题:购物袋

有一只容量为 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])

猜你喜欢

转载自blog.csdn.net/m0_52043808/article/details/123976638