• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go

1592148.jpg

16f0ebec

for循环嵌套编程题目:多少张25元纸币20元纸币15元纸币相加等到100元?

for循环嵌套编程题目:多少张25元纸币20元纸币15元纸币相加等到100元?




网友键政之人针对我的教科书题目进行了修改,可惜我无法完美地解答这个升级版题目。希望懂编程的网友指点一下,谢谢。
教科书原来的题目和解决方法如下:(可惜这种旧解决方法无法解决网友提出新问题)


  


网友键政之人提出新问题后,我也思考过如何解决,可惜本人编程水平有限并以失败告终,我针对新问题的解决方法如下:(不知道为什么结果出现了负数,人民币的数量可不能用负数表示)



1700647.jpg

键政之人

B1F  2023-04-16 23:23
(Just for fun.)

我坑你呢,这个问题至少你要按部就班再学半年才会知道怎么解

简单来说我给读一年级的你出了一道二年级的题目

不过穷举法也可以试试,把所有组合整出来

none.gif

卡卡罗特

...你按上次那种方法穷举一下用个变量存一下最大可能的纸币和,一旦发现当前枚举更优更新一下最后输出最大值大概就行了

none.gif

VCV

#include<stdio.h>

int main() {
    int x=0,y=0,z=0;
    for(x=0;x<=4;x++){
        for(y=0;y<=5;y++){
            for(z=0;z<7;z++){
                if(100==25*x+20*y+15*z){
                    printf("25有 %d 张 20有 %d 张 15有 %d 张\n",x,y,z);
                    printf("总张数:%d\n",x+y+z);//输出满足条件的总张数
                }else if(25*x+20*y+15*z>100){
                    break;
                }
            }
        }
    }
    return 0;
}

794112.jpg

神样

在f的等式下面加一个条件 if(f<0)next; 然后再加一个数组记录下所有的解,最后循环这个数组求最大值不就可以了

none.gif

c8b02cdf

力扣hot100经典题

1592148.jpg

16f0ebec

回 2楼(卡卡罗特) 的帖子

首先感谢你的回复,可惜我水平有限,不太了解。请问你能否直接编程示范给我看,谢谢。

none.gif

忘名之人

直接GPT把,省事

none.gif

嗯哼~呜呜

甚至可以在南+看到编程题目,哈哈

950907.jpg

0716e765

一眼背包问题

none.gif

嗯哼~呜呜

回 8楼(嗯哼~呜呜) 的帖子

#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
    int m = 0;
    for (int a = 0; a <= 4; a++)
    {
        for (int b = 0; b <= 5; b++)
        {
            for(int c = 0; c <= 100 / 15; c++)
            {
                if (a * 25 + b * 20 + c * 15 == 100)
                {
                    m = max(m, a + b + c);
                }
            }
        }
    }
    printf("%d",m);
    return 0;
}

1592148.jpg

16f0ebec

回 1楼(键政之人) 的帖子

感觉你比我更懂编程,希望你我日后多交流。感谢你抽时间提升了教科书题目的难度,从而激发我思考。

1592148.jpg

16f0ebec

回 3楼(VCV) 的帖子

谢谢你的回复,我稍后多参考你的编程思路。

1592148.jpg

16f0ebec

回 4楼(神样) 的帖子

谢谢你深夜还回复我,谢谢。我稍后思考一下你的建议。

1592148.jpg

16f0ebec

回 10楼(嗯哼~呜呜) 的帖子

感谢你这么详细,这么认真地回复我。我稍后多思考你的解题思路。

none.gif

飞入百姓家

B15F  2023-04-17 00:08
(坐看他人楼起楼塌)
#include <stdio.h>

int main()
{
    // 假设25元纸币的张数为x,20元纸币的张数为y,15元纸币的张数为z
    // 则x,y,z都是非负整数,并且满足25x+20y+15z=100
    // 由于100/25=4,所以x的取值范围是0到4
    // 同理,y的取值范围是0到5,z的取值范围是0到6
    // 用for循环嵌套遍历所有可能的x,y,z
    int x, y, z;
    for (x = 0; x <= 4; x++)
    {
        for (y = 0; y <= 5; y++)
        {
            for (z = 0; z <= 6; z++)
            {
                // 判断是否满足条件
                if (25 * x + 20 * y + 15 * z == 100)
                {
                    // 如果满足,打印结果
                    printf("%d张25元纸币,%d张20元纸币,%d张15元纸币\n", x, y, z);
                }
            }
        }
    }
    return 0;
}
给你来个new bing的
new bing 说结果是这个,可以自己跑一跑试试
0张25元纸币,1张20元纸币,4张15元纸币
0张25元纸币,3张20元纸币,2张15元纸币
1张25元纸币,0张20元纸币,3张15元纸币
1张25元纸币,2张20元纸币,1张15元纸币
2张25元纸币,1张20元纸币,0张15元纸币

a12.gif

harmmer

B16F  2023-04-17 00:15
(666)
尽可能多的用15元纸币

1592148.jpg

16f0ebec

回 15楼(飞入百姓家) 的帖子

感谢你深夜回复我,而且解释的这么详细。我稍后多思考你的解题思路。

a12.gif

harmmer

B18F  2023-04-17 00:27
(666)
chatGPT

这是一个典型的换钱问题,可以用动态规划求解。

定义状态:设 `f` 表示用最少的钞票数凑出 i 元,其中 i 的范围是 0 到 100 元。

状态转移方程:对于每种面额的钞票,我们可以选择使用或不使用,如果使用第 k 种面额的钞票,则需要加上一张 k 元的钞票,即 `f = min(f, f[i - k] + 1)`,其中 k 取 25、20、15。

初始状态:f[0] = 0,表示凑出 0 元不需要任何钞票。

最终答案:f[100],即用最少的钞票数凑出 100 元。

代码实现如下:

```
def min_num_of_bills(n):
    coins = [25, 20, 15]
    f = [float('inf')] * (n + 1)
    f[0] = 0
    for i in range(1, n + 1):
        for j in range(len(coins)):
            if i >= coins[j]:
                f = min(f, f[i - coins[j]] + 1)
    return f[n]

print(min_num_of_bills(100))
```

输出为 4,表示用 4 张钞票即可凑出 100 元。

none.gif

CMY

c快忘完了,闲着蛋疼用python写了个,会c看python我觉得应该没问题。。。吧?只看def里面就好
复制代码
  1. #暴力穷举输出所有结果
  2. def MoneyCombos():
  3.     max = 0
  4.     total_price = 0
  5.     for num_25 in range(5):
  6.         for num_20 in range(6):
  7.             for num_10 in range(7):
  8.                 total_price = (25 * num_25) + (20 * num_20) +(15 * num_10)
  9.                 if total_price == 100:
  10.                     max = num_25 + num_20 + num_10
  11.                     print(f"25元{num_25}张,20元{num_20}张,15元{num_10}张,一共{max}张")
  12. MoneyCombos()


如果只要最多的张数,那么:
复制代码
  1. #只需要最多的张数
  2. def MoneyCombos():
  3.     max = 0
  4.     total_price = 0
  5.     total_num = 0
  6.     for num_25 in range(5):
  7.         for num_20 in range(6):
  8.             for num_10 in range(7):
  9.                 total_price = (25 * num_25) + (20 * num_20) + (15 * num_10)
  10.                 total_num = num_25 + num_20 + num_10
  11.                 if  total_price == 100 and total_num > max:
  12.                     max = total_num
  13.     return max
  14. print(MoneyCombos())


python菜鸡大佬勿喷

另外提个小建议,你自己也感觉到了,变量用什么w代表五十,e代表二十有多难受,你自己都得写个备注上去,不如写成num_20这样代表20的数量,也别用tf,t这些了,等你过一年半载再来看这变量什么意思得看半天

以下来自chatgpt,修改后的代码在if的条件中:

我的ide会给我输出负数的结果,为什么?

可能是因为在C语言中,整数除法的结果会被截断为整数,而不是进行四舍五入或者保留小数。当计算 (100 - tf * 25 - t * 20) / 15 时,如果 (100 - tf * 25 - t * 20) 的结果不能被 15 整除,那么计算结果将被截断为整数,可能会出现负数的情况。

在这个程序中,tf 和 t 都是从 0 到 4 的整数,所以 (100 - tf * 25 - t * 20) 的结果可能小于 0,导致计算出的 f 变量值为负数。这种情况可能会导致输出负数的结果。

为了避免负数的输出,你可以对计算结果进行合适的处理,例如使用浮点数除法 (100.0 - tf * 25 - t * 20) / 15,或者对计算结果进行判断,如果小于 0 则跳过输出。以下是修改后的代码:

复制代码
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int tf, t, f;
  5.     
  6.     for(tf = 0;tf <= 4; ++tf)
  7.     {
  8.         for(t = 0;t <= 5; ++t)
  9.         {
  10.             f = (100 - tf * 25 - t * 20) / 15;
  11.             if (f >= 0 && 100 == 25 * tf + 20 * t + 15 * f)
  12.             {
  13.                 printf("tf = %d, t = %d, f = %d\n", tf, t, f);
  14.             }
  15.         }
  16.     }
  17.     return 0;
  18. }

none.gif

飞入百姓家

B20F  2023-04-17 00:30
(坐看他人楼起楼塌)

回 17楼(16f0ebec) 的帖子

我是用new bing跑了一下, 现在对于比较新手的编程问题,这玩意是真的牛逼

none.gif

878b690f

先上暴力破解,据说大学一些算法赛上都用的暴力

1592148.jpg

16f0ebec

回 18楼(harmmer) 的帖子

谢谢你帮我咨询chatGPT。

1592148.jpg

16f0ebec

回 19楼(CMY) 的帖子

感谢你深夜写了这么多字回复我。你太好人了。

165393.png

二十七

B24F  2023-04-17 00:53
(No.27)
不要陷入编程的表面, 要永远记得一定是先有数学, 才有算法. 先造数学模型, 这道题就是ax+by+cz=d, 三元一次方程组求解, 已知xyz是整数, a b c都已知, d = 100, 并且ax<=d, by<=d, cz<=d, 代入就可求所有解,

165393.png

二十七

B25F  2023-04-17 00:54
(No.27)
    private void TestChange(int a, int b, int c, int d)
    {
        if (a > d || b > d || c > d)
        {
            Debug.LogError($"错误的输入: a: {a}, b: {b}, c: {c}, d: {d}");
            return;
        }
        int aMax = Mathf.FloorToInt(d / a);
        int bMax = Mathf.FloorToInt(d / b);
        int cMax = Mathf.FloorToInt(d / c);
        for (int x = 0; x <= aMax; x++)
        {
            var yzSum = d - x * a;
            for (int y = 0; y <= bMax; y++)
            {
                var zSum = yzSum - b * y;
                for (int z = 0; z <= cMax; z++)
                {
                    var result = zSum - c * z;
                    if (result == 0)
                    {
                        Debug.Log($"x: {x}, y: {y}, z: {z}, {a} * {x} + {b} * {y} + {c} * {z} = {d}");
                    }
                }
            }
        }
    }
编程是C#

none.gif

CMY

回 23楼(16f0ebec) 的帖子

另外我觉得1楼的说法不太准确,他的这个确实难一点,但不至于跨度那么大,就几节课的差距吧我觉得,但可能每个人感受不太一样,只是我的看法

如果计算最多的值,从初学者的思路来看,只需再多来个最大值变量max,在穷举中验证所有可能值的组合的和,如果其和大于当前最大值,就做最大值替换,即我的程序中的max = total_num,最后把这个值return或者print出来就行了

最后发句牢骚,如果你是因为兴趣不是为了别的接触编程,或许可以来试试python? 反正我当时入门啥都不懂就学C给我学自闭了,然后学python学的差不多回头来学C就好了很多 当然你为了考试上课或者主攻单片机有其他的打算就算了

1592148.jpg

16f0ebec

回 25楼(二十七) 的帖子

感谢你深夜二十点还写这么多字回复我,我明天会仔细思考你的解题思路,谢谢你。

none.gif

3e7e1b53

六张 组成方式答案不唯一,记录下每个价钱对应的纸币组成然后不断枚举就可以。
你这个连续的其实就没意思了,可以换换,除以最大公约数后1 2 5,1 5 7啥的,我还碰到过过这种组成问题有没有解的,但我给忘了

1592148.jpg

16f0ebec

回 26楼(CMY) 的帖子

我原来是计划学习机械臂操作,结果发现得提前有编程基础,于是就先学习C语言。

none.gif

嘟嘟嘴

B30F  2023-04-17 03:17
(搞不懂玩法)
这属于运筹学问题吧,穷举只是辅助计算
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go