一个面试题
来源:互联网 发布:算法的乐趣代码 编辑:程序博客网 时间:2024/06/01 20:21
一个面试题:
在不超过最右边的数量的情况下任意组合,要求加起来不超过20280这个数字,但达成最接近的情况,现有一种方法为:1290*4+2990*5,差170,有没有更接近20280的答案:
数据如下:
4900*13790*22990*5//意思是不能超过5次,但可以使用1次,2次,3次,4次,5次。2390*31990*51290*4
程序如下:
void main(){ int a[] = {4900, 3790 * 1,3790*2, 2990 * 1,2990 * 2,2990 * 3,2990 * 4,2990*5, 2390 * 1,2390 * 2,2390*3, 1990 * 1,1990 * 2,1990 * 3,1990 * 4,1990*5, 1290 * 1,1290 *2,1290 * 3,1290*4 }; int len = 20; int i; //int cnt[1048575] = {0}; int tempMin = 0xfff; int cond; for ( i= 0; i < (1 << len); i++) //循环需要0 到2^len-1 次。 { int sum = 0; for (int j = 0; j < len; j++) { if ((i&(1 << j)) != 0) //这个地方很巧妙。 { sum = sum + a[j]; } //cout <<i<<" "<<j<<" "<< sum << " " << 20280 - sum << endl; } if ((abs(20280 - sum) < tempMin)&&((i&(0x6))<=4)&&((i&(0xf8))<=0x80)&&((i&(0x700))<=0x400)&&((i&(0xf800))<=8000)&&((i&(0xf0000))<=80000)) { tempMin = abs(20280 - sum); cond = i; if (tempMin == 0) cout << i << " " << tempMin << endl; } } cout <<tempMin<<" "<< cond << endl;}
最终答案是:
2390*2 2990*1 3790*2 4900
这个程序的主要思想是使用了一个位映射的思想解决了这个需要好多次循环才能解决的问题。
同时我们可以看到对于10M左右的int型数组,VS的栈好像不能成功分配,但是不考虑分配的话,直接使用,运算速度是相当快的,运算一遍一秒不到。
阅读全文
0 0
- 一个公司面试题~!
- 一个数据库面试题
- 一个面试题
- 一个面试题
- 一个sql面试题
- 一个SQL面试题
- 一个面试题
- 一个面试题
- 一个SQL面试题
- 一个小面试题
- 一个面试题
- 腾讯面一个试题
- 一个面试题
- 一个fork 面试题
- 一个数组面试题
- 一个Java面试题
- 一个面试题。。。
- 一个php面试题
- Mysql主从配置
- Hdu-6052 To my boyfriend(单调栈)
- SLAM学习——回环检测
- 设计模式-11-享元模式
- Yii2 ajax 提交 view 端 和 controller端
- 一个面试题
- storm与流计算
- Sublime Text编辑器在前端中的快捷操作
- 5种排序算法的Java代码
- 杭电oj1017
- AutoCAD文档01——安装教程
- No module named keras
- Yii2 关于 Url::toRoute 和Url::to 路径 例子
- 多线程笔试面试题(1)