回溯法求解背包个数问题

来源:互联网 发布:2017网络灰色赚钱项目 编辑:程序博客网 时间:2024/04/30 07:14

华电北风吹
天津大学认知计算与应用重点实验室
2016-07-03

每个背包最大容量20,有N个物品,问至少需要多少个背包才能装完所有的物品?
输入描述:
第一行物品个数N,第二行N个整数,表示各个物品重量。物品个数小于等于10,物品重量小于等于10.

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

#include <iostream>#include <fstream>using namespace std;#define LENGTH 11#define LIMITE 20int 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;}
0 0
原创粉丝点击