给你一堆数,从中选若干个数凑出7的倍数,输出其中最大的那个7的倍数 如何编程解决?

1个回答

  • 楼上的解法都正确,但是数字多于30个的时候就会很慢!

    这是背包问题的变形~!背包才是正解~

    先求出所有数字的和 和是7的倍数就最好啦~

    不是的话就找出比和小又最接近和的7的倍数 然后背包一下看行不行~

    再不行就试次小的数 一直试下去直到行为止 如果一直到7都不行就无解了!

    如果使用备忘录算法 由于用的是同一个数组 所以时间复杂度不会很高~

    几百几千个数字都可以秒杀~

    你找一下背包问题,到处都有详细解答~

    跟这个问题类似 只要稍微改一下题目和代码就行

    改了之后思路如下 帮你换成c语言了 给分啊~!

    有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积(正整数).要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为零.(这里的v就是你的s,这里的n就是你的n)

    l 搜索方法 (一堆数的数目很少的时候就可以直接搜索 否则还是要用动归)

    void search(int k,int v) {搜索第k个物品,剩余空间为v}

    {

    int i,j;

    if(v=best return; // s[n]为前n个物品的重量和

    if(kw[k]) search(k+1,v-w[k]); // w[n]为第n个物品的重量

    search(k+1,v);

    }

    }

    best为全局变量,表示箱子的剩余空间的最小值,初始值为设为很大的正数就好

    所以 search(n,v)后 best为0则表示有解

    2 DP 动态规划(迭代法)

    F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型.

    实现:将最优化问题转化为判定性问题

    F [I][j] =( F [ I-1 ][ j-w[I] ] || F [ I-1 ][ j ] )(w[I]