题目链接:https://www.acwing.com/problem/content/3/
题目描述:
解题思路:与01背包问题解法代码相似(01背包问题:AcWing-2-01背包问题_m0_52311818的博客-CSDN博客)
与01背包问题不同点:1)每件物品可以在背包容量足够的情况下无限制拿取。
2)最大价值不一定在list[n][m]上需要对list的第m列排序。
时间复杂度:O(n*n).
AC代码:
#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;
}