前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >华为校招2016.09机试 第3题: 装满篮子

华为校招2016.09机试 第3题: 装满篮子

作者头像
Enjoy233
发布2019-03-05 15:02:44
3320
发布2019-03-05 15:02:44
举报
文章被收录于专栏:大白技术控的技术自留地

华为校招2016.09机试

第3题: 装满篮子

描述: 假设一个篮子最大载重为W,要求从多个不同重量物品中挑选出部分,使得其重量之和刚好等于W。输入若干个正整数,其中第一个数值为篮子载重,后面若干个数值表示不同物品的重量,请判断是否存在方案能刚好装满篮子。存在装满篮子的方案则输出YES,并按照输入顺序输出装入篮子的物品重量,以空格隔开;若不存在则输出NO。备注:本题中只存在一种装载方案。

运行时间限制: 无限制 内存限制: 无限制

输入: 输入若干个正整数,其中第一个数值为篮子载重,后面若干个数值表示不同物品的重量。为了编程方便,限定输入的整数个数不超过20个。

输出: 存在刚好装满篮子方案则输出YES,并按照输入顺序输出装入篮子的物品重量,以空格隔开;不存在则输出NO。

样例输入: 10 4 5 6 样例输出: YES 4 6

测试用例AC比例: 7/8

代码语言:javascript
复制
#include <cstdio>
using namespace std;

typedef long long int64;
int64 fit(int x, int64* w){
    int64 s = 0;
    int k = 0;
    while (x){
        if (x & 1) s += w[k];
        k++;
        x >>= 1;
    }
    return s;
}
void put(int x, int64* w){
    int k = 0;
    while (x){
        if (x & 1) printf(" %lld", w[k]);
        k++;
        x >>= 1;
    }
    puts("");
}
int main(){
    int64 w[100];
    int n = 0;
    int64 W;
    scanf("%lld", &W);
    while (scanf("%lld", &w[n++]) != EOF);
    int N = 1 << n;
    int find = 0;
    for (int k = 0; k < N; k++){
        if (W == fit(k, w)) {
            find = 1;
            printf("YES");
            put(k, w);
            break;
        }
    }
    if (!find) puts("NO");

    return 0;
}

此题得分: 264分, 样例通过率为7/8.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年10月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 华为校招2016.09机试
  • 第3题: 装满篮子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档