标签:背包 weight int res value 完全 物品 dp
有个容量为v的背包,有n个物品,对应的重量和价值存放在数组weight[]和value[]中。物品可以放到背包中,不能超过包容量,即包里物品重量不能超过v。放到包里的物品可以重复,即物品假设有无数个。物品可以放0个或者多个
与01背包不一样,01背包,一个物品要么放,要么不放。完全背包,一个物品可以不放,或者1个,或者多个
用动态规划解决
递推公式res[i][j] = max {res[i - 1][j], res[i][j - weight[i]] + value[i] }
res[i][j]表示容量为j放i个物品的最大价值
// dp[i][j] = max{dp[i - 1][j], dp[i][j - weight[i]] + value[i]} public int completePackage(int[] weight, int[] value, int n, int v) { int[][] res = new int[n + 1][v + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= v; j++) { if (j < weight[i - 1]) res[i][j] = res[i - 1][j]; else res[i][j] = Math.max(res[i - 1][j], res[i][j - weight[i - 1]] + value[i - 1]); } } return res[n][v]; }
优化数组空间后
// dp[j] = max{dp[j], dp[j - weight[i]] + value[i]} // int[] weight = {2, 3, 4, 7}; // int[] value = {1, 3, 5, 9}; // int n = 4; // int v = 10; // res: 12 public int completePackageUseLessSpace(int[] weight, int[] value, int n, int v) { int[] res = new int[v + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j<= v; j++) { if (j >= weight[i - 1]) res[j] = Math.max(res[j], res[j - weight[i - 1]] + value[i - 1]); } } return res[v]; }
标签:背包,weight,int,res,value,完全,物品,dp 来源: https://www.cnblogs.com/luckygxf/p/15226137.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。