题目如下:
时间限制:C/C++语言1000Ms;其他语言3000 Ms
内存限制:C/C+语言65536KB;其他语言589824KB
题目描述:
小W非常喜欢吃零食,经常都会去零食间里购买半价的零食吃,但是他为了控制自己的体重,因此会限制自己买零食的开销在某个数值以内。
但是小W有一个特别的爱好,他对于某些零食特别的喜欢,并且会对这些零食的喜爱程度进行排序。对于零食A和零食B,如果小W对零食A的喜爱程度大于对零食B的喜爱程度,那么每次拿零食的时候,一定会确保A的数目比B多。
现在零食间里有N种零食,假设每种零食都是取不完的,但小W每次都会刚好花完所有的开销,那么小W去取零食的时候应该有多少种可能的取法呢?
输入
输入包含多组测试数据,每组数组:
第一行:买零食的开销V(V<1000和所有的零食种类数目N(N<200)
第二行:第i个正整数表示第i种零食的价格ci(ci<1000)
第三行:特别喜欢的零食的种类数M(2<=M<=N)
第四行:按照对M种零食的喜爱程度从高到低排序,第i种零食的喜爱程度会大于第i+1种,保证不会形成环
输出
对于每组测试数据
输出一个整数ans,表示在满足小W的特殊偏好的情况下,并且花光所有开销,有多少可能方案。由于ans可能很大,因此最终结果ans%100000
下面是暴力穷举法的代码,笔者才浅,没想到特别好的算法来解决这个问题,如果有更好的算法,希望能在评论区指出,多谢! 刷了一阵leetcode,实现了另一种解法,见后文。
//暴力穷举法
#include <iostream>
#include <vector>
using namespace std;
int result_num = 0;
//打印vector
template <typename T>
void print_vector(vector<T> vec) {
cout << '[';
//遍历输出,空格间隔
for (auto i = vec.begin(); i != vec.end(); i++) {
if (i + 1 == vec.end())
cout << *i << ']' << endl;
else
cout << *i << " ";
}
}
//计算方案result所需花销
int cal_cost(const vector<int>& results, const vector<int>& costs) {
int cost = 0;
for (size_t i = 0; i < results.size