有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 v[i],价值是 w[i],求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
测试数据:
输入:
4 6
1 2
2 4
3 8
4 10
输出:16
代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /**************************************************************** * Description: C++ implementation of unbounded knapsack * Author: Alex Li * Date: 2023-06-20 16:43:44 * LastEditTime: 2023-06-20 21:22:28 ****************************************************************/ #include <iostream> using namespace std; const int MAXN=1000; const int MAXV=100; int dp[MAXN][MAXV]; int value[MAXV]; int weight[MAXN]; int main(){ int n,m,ik[MAXN][MAXV]; cin>>n>>m; for(int i=1;i<=n;i++)cin>>weight[i]>>value[i]; for(int i=1;i<=n;i++){ for (int j = 0; j <=m; j++){ //k是指i商品被用的件数,当k为0时,也就代表不选i商品,相当于初始化dp[i][j] for (int k = 0; k*weight[i]<=j; k++){ dp[i][j]=max(dp[i][j],dp[i-1][j-k*weight[i]]+k*value[i]); } } } cout<<dp[n][m]; return 0; } |