您的位置:首页 > 其它

回溯法求解背包个数问题

2016-07-03 19:38 471 查看
华电北风吹

天津大学认知计算与应用重点实验室

2016-07-03

每个背包最大容量20,有N个物品,问至少需要多少个背包才能装完所有的物品?

输入描述:

第一行物品个数N,第二行N个整数,表示各个物品重量。物品个数小于等于10,物品重量小于等于10.

解题思路:

回溯法求解。不知道有没有更好的思路。。。

#include <iostream>
#include <fstream>
using namespace std;

#define LENGTH 11
#define LIMITE 20

int stoneWeight[LENGTH];
int rounState[5];

bool func(int stoneIndex, const int& SumRoundNum, const int& N)
{
if (stoneIndex == N)
return true;
int weight = stoneWeight[stoneIndex];
for (int i = 0; i < SumRoundNum; i++)
{
if (rounState[i] + weight <= LIMITE)
{
rounState[i] += weight;
if (func(stoneIndex + 1, SumRoundNum, N))
return true;
else
rounState[i] -= weight;
}
}
return false;
}

int main()
{
ifstream in(".\\input.txt");
cin.rdbuf(in.rdbuf());

int N, sum = 0;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> stoneWeight[i];
sum += stoneWeight[i];
}
int count = sum / LIMITE;
while (true)
{
memset(rounState, 0, sizeof(rounState));
if (func(0, count, N))
{
cout << count << endl;
break;
}
else
{
count++;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: