趋势科技第二题8.8技术分享

经典的动态规划问题,多重背包,但是问题不是求方案总数,而是求解方案数组合长度问题。
面值 1,5,10,20,50,100元,输入第一行为,集中面值的个数,问组成M元的方案长度为多大?
例如:
输入:
6 5 4 3 2 1
11
输出:
12
解析:最后得出的组合有三种,分为{1 1 1 1 1 1 7 5}、{1 5 5}、{1 10}
长度之和为7+3+2=11.
条件动态规划
#include<iostream>

#include<vector>

using namespace std;



//int v[1001] = {0};

//int f[1001] = {0};

struct F

{

    int value;

    int len;

}f[1001];



int main()

{  

    int v[7] = {0, 1, 5, 10, 20, 50, 100 };

   

    int arr[7] = { 0 };

    int m = 0;

    while (cin >> arr[1] >> arr[2] >> arr[3] >> arr[4] >> arr[5] >> arr[6])

    {

        cin >> m;

        f[0].value = 1;

        f[0].len = 0;

        for (int i = 1; i < 1001; i++)

        {

            f[i].value = 0;

            f[i].len = 0;

        }

        for (int i = 1; i <= 6; i++)

        {

            for (int j = m; j >= v[i]; j--)

            {

                for (int k = 1; k <= j / v[i] && k <= arr[i]; k++)

                {

                    if (f[j - k*v[i]].value == 1)

                    {

                        f[j].len += k;

                        f[j].len += f[j - k*v[i]].len;

                    }

                    f[j].value += f[j - k*v[i]].value;

                }

            }

        }

        cout << f[m].value<<" "<<f[m].len << endl;//输出方案数和方案总长度

    }

    system("pause");

    return 0;

}



#趋势科技##笔试题目##C/C++#
全部评论
厉害,可以简单说下思路吗
点赞 回复 分享
发布于 2019-08-09 13:27

相关推荐

宇智波爱学习:我还没收到笔试
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
3
21
分享
牛客网
牛客企业服务