背包问题是比较常见的算法问题,下面分别给出了动态规划与列举法实现方式,代码如下:
动态规划:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#define V 1500
unsigned int f[10][V];//全局变量,自动初始化为0
unsigned int weight[10];
unsigned int value[10];
#define max(x,y) (x)>(y)?(x):(y)
int main()
{
freopen("input.txt", "r", stdin);
int N, M;
cin >> N;//物品个数
cin >> M;//背包容量
for (int i = 1; i <= N; i++)
{
cin >> weight[i] >> value[i];
}
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
if (weight[i] <= j)//可以放下的情况,多的kg数能放的净重,可以将其他的溢出
{
f[i][j] = max(f[i - 1][j], f[i - 1][j - weight[i]] + value[i]);
}
else
f[i][j] = f[i - 1][j];//不可以放下的情况
}
}
cout << f[N][M] << endl;//输出最优解
}
其中输入input.txt内容如下:
5
10
2 3
2 6
6 5
5 4
4 6
列举法:
#include<iostream>
using namespace std;
#define SUM 10
int main()
{
int count = 0;
int res = 0;
int a[5] = { 0 };
for (int i = 0; i <= SUM; i++)
{
a[0] = i;
for (int j = 0; j <= SUM - i; j++)
{
a[1] = j;
for (int m = 0; m <=SUM - i - j; m++)
{
a[2] = m;
for (int n = 0; n <= SUM - i - j - m; n++)
{
a[3] = n;
a[4] = SUM - i - j - m - n;
int sum = 0;
if (a[0] >= 2)
sum = sum + 6;
if (a[1]>=2)
sum = sum + 3;
if (a[2]>=6)
sum = sum + 5;
if (a[3]>=5)
sum = sum + 4;
if (a[4]>=4)
sum = sum + 6;
if (sum > res)
res = sum;
count++;
}
}
}
}
cout << "total count="<<count<<",Max value="<<res<<endl;
return 0;
}