刚学c++,这道题目我实在是不会

沙雕蛙 2019-09-11 07:17:21
如图,这个如果解决?
...全文
623 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸若烟海 2019-09-17
  • 打赏
  • 举报
回复
我认为六楼说的对。。。。。。
hglzw 2019-09-17
  • 打赏
  • 举报
回复
引用 12 楼 stherix 的回复:
[quote=引用 11 楼 hglzw 的回复:]
[quote=引用 6 楼 stherix 的回复:]
这题目限制只有2种物品
那就很简单了
先全购买便宜的物品
然后看余下的钱是不是大于等于两者的差价
如果大于就用余钱除以差价,得到替换数量
然后把替换数量的便宜物品替换成贵的

这样循环都不需要 时间复杂度O(1),空间要求也很低


感觉有点不对,假如81元,2种商品5元和8元。按楼主算法应该换16个5元的和0个8元的,最后余1元。实际上是可换5个5元的和7个8元的,正好81.[/quote]

注意 题目 要求的是 最高的零食数量,然后再考虑最高的总价格[/quote]

确实是我理解错题意了,这样子的话6楼的分析就是正确的,兼顾了数量和钱。
stherix 2019-09-17
  • 打赏
  • 举报
回复
引用 13 楼 hglzw 的回复:
[quote=引用 10 楼 aliezeng77 的回复:] int a=7, b=9, n=80; int j_min=a, a_min=0; for(int i=0; i<=n/a; i++) { int j=(n-i*a)%b; if(j==0) { a_min=i; break; } if(j<j_min) { j_min=j; a_min=i; } } printf("a=%d, b=%d\n", a_min, (n-a*a_min)/b);
10楼正解,用枚举法,先假定买第一种商品0个,剩余的钱和第二种商品求余得到一个余数;再假定先买第一种商品1个,剩余的钱再和第二种商品求余又得到1个余数;以此类推直到买最多第一种商品(钱不够了),最后再所有余数里面找出最小的数,就是剩余钱最小的数。[/quote] ] 压根就没理解题意 按照你的理解,例题的输出应该是5 5 ,而不是10 1
hglzw 2019-09-17
  • 打赏
  • 举报
回复
引用 10 楼 aliezeng77 的回复:
int a=7, b=9, n=80;
int j_min=a, a_min=0;

for(int i=0; i<=n/a; i++)
{
int j=(n-i*a)%b;

if(j==0)
{
a_min=i;
break;
}

if(j<j_min)
{
j_min=j;
a_min=i;
}
}

printf("a=%d, b=%d\n", a_min, (n-a*a_min)/b);

10楼正解,用枚举法,先假定买第一种商品0个,剩余的钱和第二种商品求余得到一个余数;再假定先买第一种商品1个,剩余的钱再和第二种商品求余又得到1个余数;以此类推直到买最多第一种商品(钱不够了),最后再所有余数里面找出最小的数,就是剩余钱最小的数。
stherix 2019-09-17
  • 打赏
  • 举报
回复
引用 11 楼 hglzw 的回复:
[quote=引用 6 楼 stherix 的回复:] 这题目限制只有2种物品 那就很简单了 先全购买便宜的物品 然后看余下的钱是不是大于等于两者的差价 如果大于就用余钱除以差价,得到替换数量 然后把替换数量的便宜物品替换成贵的 这样循环都不需要 时间复杂度O(1),空间要求也很低
感觉有点不对,假如81元,2种商品5元和8元。按楼主算法应该换16个5元的和0个8元的,最后余1元。实际上是可换5个5元的和7个8元的,正好81.[/quote] 注意 题目 要求的是 最高的零食数量,然后再考虑最高的总价格
hglzw 2019-09-17
  • 打赏
  • 举报
回复
引用 6 楼 stherix 的回复:
这题目限制只有2种物品
那就很简单了
先全购买便宜的物品
然后看余下的钱是不是大于等于两者的差价
如果大于就用余钱除以差价,得到替换数量
然后把替换数量的便宜物品替换成贵的

这样循环都不需要 时间复杂度O(1),空间要求也很低


感觉有点不对,假如81元,2种商品5元和8元。按楼主算法应该换16个5元的和0个8元的,最后余1元。实际上是可换5个5元的和7个8元的,正好81.
NorZ 2019-09-17
  • 打赏
  • 举报
回复
勉强写了一下

#include <iostream>
using namespace std;

int main(int argc, const char* argv[])
{
int n,a,b = 0;
bool convert = false;
cout << "Input Total Money:";
cin >> n;
cout << "Input A Price:";
cin >> a;
cout << "Input B Price:";
cin >> b;

if ((n < a) || (n < b)) {
cout << "Invalid arguments" << endl;
return -1;
}

if (b > a) { // 将价高者放在 a 上
cout << "Choose more B" << endl;
int c = a;
a = b;
b = c;
convert = true;
cout << "After convert -- A: " << a << ", B: " << b << endl;
}
int i = 0;
int j = 0;
int max_sum = 0;
int max_price = 0;
int max_i = 0;
int max_j = 0;

for (i = 0; i < n/a + 1; ++i) {
for (j = 0; j < (n - i * a)/b + 1; ++j) {
if ((i + j) >= max_sum) { // 记录数量最高,且偏贵者最多的
if (i >= max_i) {
max_sum = i + j;
max_i = i;
max_j = j;
}
}
}
}

if (convert) {
int c = max_i;
max_i = max_j;
max_j = c;
}
cout << "Choose " << max_i << " A" << endl;
cout << "Choose " << max_j << " B" << endl;
return 0;
}
aliezeng77 2019-09-17
  • 打赏
  • 举报
回复
引用 19 楼 636f6c696e 的回复:
这是数学,不是变成
有输入输出格式你说不是编程?再说编程也是数学
636f6c696e 2019-09-17
  • 打赏
  • 举报
回复
这是数学,不是变成
aliezeng77 2019-09-17
  • 打赏
  • 举报
回复
void main()
{
int a=7, b=9, n=90;
int max_a=0;
int max_sum=n/b;
int yue_min=n%b;

for(int i=0; i<=n/a; i++)
{
int j=(n-a*i)/b;

if(i+j>max_sum) // 数量最多
{
max_sum=i+j;
max_a=i;
yue_min=(n-a*i)%b;
}
else if(i+j==max_sum)
{
int yue=(n-a*i)%b;

if(yue<yue_min) // 余额最少
{
max_sum=i+j;
max_a=i;
yue_min=yue;
}
}
}

printf("a=%d, b=%d, yue=%d\n", max_a, (n-a*max_a)/b, yue_min);
}
super_admi 2019-09-17
  • 打赏
  • 举报
回复
我还以为你是老赵。

引用 7 楼 _肆 的回复:
[quote=引用 6 楼 stherix 的回复:]
这题目限制只有2种物品
那就很简单了
先全购买便宜的物品
然后看余下的钱是不是大于等于两者的差价
如果大于就用余钱除以差价,得到替换数量
然后把替换数量的便宜物品替换成贵的

这样循环都不需要 时间复杂度O(1),空间要求也很低
nb,降维打击[/quote]
aliezeng77 2019-09-16
  • 打赏
  • 举报
回复
int a=7, b=9, n=80;
int j_min=a, a_min=0;

for(int i=0; i<=n/a; i++)
{
int j=(n-i*a)%b;

if(j==0)
{
a_min=i;
break;
}

if(j<j_min)
{
j_min=j;
a_min=i;
}
}

printf("a=%d, b=%d\n", a_min, (n-a*a_min)/b);
aliezeng77 2019-09-16
  • 打赏
  • 举报
回复
样例答案怎么会是10,1, 难道不是5,5么?
_肆 2019-09-12
  • 打赏
  • 举报
回复
引用 6 楼 stherix 的回复:
这题目限制只有2种物品
那就很简单了
先全购买便宜的物品
然后看余下的钱是不是大于等于两者的差价
如果大于就用余钱除以差价,得到替换数量
然后把替换数量的便宜物品替换成贵的

这样循环都不需要 时间复杂度O(1),空间要求也很低
nb,降维打击
stherix 2019-09-12
  • 打赏
  • 举报
回复
这题目限制只有2种物品 那就很简单了 先全购买便宜的物品 然后看余下的钱是不是大于等于两者的差价 如果大于就用余钱除以差价,得到替换数量 然后把替换数量的便宜物品替换成贵的 这样循环都不需要 时间复杂度O(1),空间要求也很低
榕树’ 2019-09-12
  • 打赏
  • 举报
回复
int min = a < b ? a : b;
int max = a + b - min ;
int cnt1 = n / min ;
int cnt2 = 0 ;
int m = n % min ;
if(cnt1 > 0 && min + m >= max)
{
cnt1 -= 1 ;
cnt2 = 1 ;
}
if(a > b)
{
int temp = cnt1;
cnt1 = cnt2;
cnt2 = temp;
}
Italink 2019-09-11
  • 打赏
  • 举报
回复
只有两种物品直接暴力求解就行

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
int n, a, b;
cin >> n >> a >> b;
pair<int, int> num{0,0};
int A, B;
for (int i = 0; i <= max(n / a, n / b); ++i) {
A = i;
B = (n - A * a) / b;
if (A + B > num.first + num.second||
A + B == num.first + num.second && A * a + B * b > num.first * a + num.second * b )
num = { A,B };
}
cout << num.first << " " << num.second << endl;
return 0;
}
沙雕蛙 2019-09-11
  • 打赏
  • 举报
回复
引用 2 楼 Italink的回复:
贪心算法比较快,但不一定是最优解(也就是楼上所说的) DP算法简单且高效,解决最优解问题的不二算法 递归dfs、bfs,容易写,但效率不高
dp算法要怎么弄呢?
沙雕蛙 2019-09-11
  • 打赏
  • 举报
回复
那么DP算法要怎么弄呢?
Italink 2019-09-11
  • 打赏
  • 举报
回复
贪心算法比较快,但不一定是最优解(也就是楼上所说的) DP算法简单且高效,解决最优解问题的不二算法 递归dfs、bfs,容易写,但效率不高
加载更多回复(1)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧