- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您有 n 个具有特定值(value)的硬币。您的任务是找到使用这些硬币可以创造的所有金额。
输入
第一行输入有一个整数n:硬币数量。
下一行有 n 个整数 x1,x2,…,xn:硬币的值。
输出
首先打印一个整数k:不同货币总和的数量。之后,按升序打印所有可能的总和。
约束
1≤n≤100
1≤xi≤1000
示例
输入:
4
4 2 5 2
输出:
9
2 4 5 6 7 8 9 11 13
我编写了一个代码,该代码对于小输入非常有效,但对于大输入给出了错误的答案。请帮忙找出错误以及如何纠正。
我的代码是:
#include <bits/stdc++.h>
using namespace std;
set<long long> s;
// Prints sums of all subsets of array
void subsetSums(long long arr[], long long n)
{
// There are totoal 2^n subsets
long long total = 1 << n;
// Consider all numbers from 0 to 2^n - 1
for (long long i = 0; i < total; i++)
{
long long sum = 0;
// Consider binary reprsentation of
// current i to decide which elements
// to pick.
for (long long j = 0; j < n; j++)
if (i & (1 << j))
sum += arr[j];
// Print sum of picked elements.
if (sum)
s.insert(sum);
}
}
// Driver code
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long long n;
cin >> n;
long long arr[n];
for (long long i = 0; i < n; i++)
{
cin >> arr[i];
}
subsetSums(arr, n);
cout << s.size() << "\n";
for (auto it = s.begin(); it != s.end(); ++it)
cout << *it << " ";
return 0;
}
例如,它给出了错误的答案
50
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
作为
18
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36
正确的输出应该是:
50
1 2 3 4 ... 50
最佳答案
你的代码太慢2^n
子集在最坏的情况下(当n=100
)给出1,267,650,600,228,229,401,496,703,205,376
子集,而C++ 平均每秒执行大约 1000,000,000
次操作。
这个问题可以用动态规划来解决,考虑有一个大小为100001
的数组dp
,这样dp[x]
表示如果x
的总和是可以实现的。
基本情况很简单 - 不使用任何硬币就可以得到 0
的总和:dp[0]=1
然后,对于每种硬币,我们可以尝试按硬币值(value)增加现有金额以填满我们的表格:
for each coinValue:
for coinSum = 100000 - coinValue; coinSum >=0; coinSum--)
if(dp[coinSum])
dp[coinSum + coinValue]=1
请注意,我们正在向后循环,这是故意这样做的,以便每个硬币仅使用一次。
复杂度:O(n^2*maxCoinValue)
关于c++ - 给定硬币的所有可能总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62357952/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!