解体思路为贪心法,先选择分数最大的题目,依次循环下去,递归得到答案:
#include<iostream>
#include<vector>
using namespace std;
int a[] = { 2, 6, 18, 23, 31, 36, 44, 52, 79, 93 }; //十道题目的分数
vector<int> b; //用于存储分数和为100的题目
int greed(int surplu, int j) //参数1表示剩余分数,参数二表示当前选择的题序
{
for (int i = j; i >= 0; --i)
{
int surplus = surplu;
surplus = surplus - a[i];
if (surplus == 0){ //递归终止条件
b.push_back(a[i]);
return 0;
}
if (i - 1 < 0) break; //搜寻到最后一题,跳出当前循环
else if (surplus > 0) //如果剩余分数,继续出题
{
if(!greed(surplus, i - 1))
{
b.push_back(a[i]);
return 0;
}
}
else if (surplus < 0 ) //如果题目分数超出满分,则撤回一步
{
surplus = surplus + a[i];
continue;
}
}
return 1;
}
int main()
{
greed(100, 9);
for (int i = 0; i < b.size(); i++)
cout << b[i] << endl;
}