我知道这是一个背包问题,其中权重和值相等,但我认为我在编码逻辑上犯了一个错误,因为即使对于数组中元素的数量(N)为50并且所需的最大总和(M)4500。
为了澄清这个问题,我们得到了一个由N个正整数和一个正整数M组成的数组。数组元素只能使用一次。我们必须找到这个数组的子集(不一定是连续的),使得总和最接近M,但不超过它。
这是我使用动态编程的尝试:
int M, N, price[100];
int memo[5000][100];
int dp(int left, int g)
{
if (left < 0)
return -10000000;
if (g == N)
return M - left;
if (memo[left][g] != -1)
return memo[left][g];
int ans = -1;
ans = max(ans, dp(left - price[g], g + 1));
ans = max(ans, dp(left, g + 1));
//cout<<g<<ln;
return memo[left][g] = ans;
}
void solve()
{
cin >> M >> N;
forn(i, N)
{
cin >> price[i];
}
int score;
memset(memo, -1, sizeof memo);
score = dp(M, 0);
//print_dp(M,0);
if (score < 0)
cout << "NO SOLUTION";
else
cout << score << ln;
}
int main(){
solve();
return 0;
}
那么在我的代码中是否有任何可能的优化可以帮助我降低复杂性,因为这甚至不是最大的测试用例,有一个M=10^9的测试用例。以及如何跟踪解决方案的实际子集,因为这里我只是返回最终的最大可能总和。任何指导都将不胜感激!谢谢你
考虑下一个代码(ideone)。
对于每个价格(p
),它会检查备忘数组的所有单元格,并标记单元格j
,如果可以用p
和一些以前的总和j-p
组合值j
。它还更新jmax-max-max-sum,并将其作为结果返回。对于数据集,它给出尽可能多的和(
#include <iostream>
#include <cstring>
using namespace std;
int M, N, p;
int memo[5000];
int solve()
{
cin >> M >> N;
int i, j, jmax = 0;
memset(memo, 0, sizeof(memo));
memo[0] = 1;
for(i = 0; i < N; i++) {
cin >> p;
for(j=M; j>=p; j--){
if(memo[j-p]) {
memo[j]=1;
if(j>jmax)
jmax = j;
}
}
}
return jmax;
}
int main(){
std::cout<<solve();
return 0;
}
问题内容: 说我有一个清单。我想找到3个最接近的数字,例如6.5。然后返回的值将是。 在python中找到一个最接近的数字并不是那么棘手,可以使用 但是我试图不绕这个循环找到k个最接近的数字。有pythonic方法可以完成上述任务吗? 问题答案: 简短的答案 该 heapq.nsmallest() 函数将整齐,有效地做到这一点: 本质上是这样说的:“给我三个与 6.5 绝对差值最小的输入值”。 算
我正在尝试自动查找一个数字与另一个数字的最接近因子; 示例: 700到30的最接近因子是28(30不等于700,但28等于700)。 一个显而易见的解决方案就是得到700的所有因子,并做一个简单的距离计算,找到离30最近的因子,但这似乎是低效的。 另一种解决方案是找到所有基本质因数,例如: 将这些数字相乘得到所有的组合,从而找到最接近的。 我正在尝试对其进行编程,使其自动化。有更好的解决方案吗?
给定一个无序整数列表,以这种方式打印两个总计为的整数(int 1小于或等于int 2,它们之间用空格隔开)。假设整数列表中总是有的解。int1和int2必须是正整数。 如果有多个解决方案,请打印差异最小的整数对。 例子: 这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。 更新:代码工作!
可能的子集:- 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集和是否>=k,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?
假设您给出了一个大小为N的数组,它可以有正数和负数。我们需要返回总和的最大子数组的长度等于k。我尝试使用滑动窗口算法,但很快我发现它在这里不起作用,因为数组元素可以有正负整数。 例如: arr=[-20,-38,-4,-7,10,4]和k = 3很明显,有两个可能的子阵列([-4,-7,10,4]和[-7,10]),它们的和等于给定的k。因此输出将是4(最大子阵列的长度) 蛮力方法将采取O(n^2
给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对