楼上的解法都正确,但是数字多于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]