AcWing-3-完全背包问题

题目链接:https://www.acwing.com/problem/content/3/

题目描述:

AcWing-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;
}

 

AcWing-3-完全背包问题

上一篇:【C语言深度剖析】你真的懂C语言中的位操作符吗?(按位与、按位或、按位异或)(代码例题+详细图解)


下一篇:MAC OS X API知识摘抄