【c++】大疆笔试题,应该怎么吃呢

题目如下:

时间限制: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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值