题目链接:https://www.acwing.com/problem/content/3/
题目描述:
解题思路:与01背包问题解法代码相似(01背包问题:https://www.cnblogs.com/ygsr/p/14494434.html)
与01背包问题不同点:1)每件物品可以在背包容量足够的情况下无限制拿取。
2)最大价值不一定在list[n][m]上需要对list的第m列排序。
时间复杂度:O(n*n)
源代码:
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int list[1005][1005]; int v[1005], w[1005]; int main() { int n,m,t=0; cin >> n >> m; memset(list,0,n*n*4); for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for(int i=1;i<=n;i++) for (int j = 1; j <= m; j++) { list[i][j] = list[i-1][j]; if (j >= v[i]) list[i][j] = max(max(list[i][j], w[i] + list[i - 1][j - v[i]]), w[i] + list[i][j - v[i]]); } for (int i = 1; i <= n; i++) { for (int j = i+1; j <= n; j++) { if (list[i][m] > list[j][m]) { t = list[i][m]; list[i][m] = list[j][m]; list[j][m] =t; } } } cout << list[n][m]; return 0; }