問個筆試的問題,請指教!


某人去郵局郵寄郵件,郵資大於8分,現郵局有面值3分和5分的郵票。問此人應購買幾張3分郵票及幾張5分郵票。試設計一程序。給出所有組合發及張數最少的買法

23 个解决方案

#1


1.郵票最少的張數為2張,5 +5=10
2.最多的張數是3張 3+5+3 等等 用歸納法
3.面值和得范圍是大於等於9,小於等於15.用for語句兼if語句

#2


給出所有組合發及張數最少的買法
---------------張數最少的買法------------------


#include <stdio.h>

void f(int t,int& m, int& n)
{
m = t/5;
int j = t%5;
n = j/3;
j = j%3;
switch(j)
{
case 0:
break;
case 1:
--m;
n = 2;
break;
case 2:
if(m>1)
{
m -= 2;
n = 4;
}
m = 0;
if(t%3 == 0)
n = t/3;
else
{
n = t/3;
n++;
}
break;
}
}

int main()
{
int t = 13;
int m,n;
f(t,m,n);
printf("5:%d    3:%d\n",m,n);
return 0;
}

#3


有缺點,在14的時候錯了!

#4


這個應該是對的,算所有的

#include <stdio.h>

void f(int t,int& m, int& n)
{
m = t/5;
int j = t%5;
n = j/3;
j = j%3;
switch(j)
{
case 0:
break;
case 1:
--m;
n += 2;
break;
case 2:
if(m>1)
{
m -= 2;
n = 4;
}
m = 0;
if(t%3 == 0)
n = t/3;
else
{
n = t/3;
n++;
}
break;
}
}

int main()
{
int t = 100;
int m,n;
f(t,m,n);
printf("the less number five:%d    three:%d\n",m,n);
int c=0;
while(++c&&m>=0)
{
printf("five:%d    three:%d\n",m, n);
m -= 3;
n +=5;
}
return 0;
}

#5


11

#6


靠,我四次還可以啊??
int c=0;
while(++c&&m>=0)
其中的C是沒有的

#7


對不起大家!這個才是最“便宜”(不浪費錢)的算發
#include <stdio.h>

void f(int t,int& m, int& n)
{
m = t/5;
int j = t%5;
n = j/3;
j = j%3;
switch(j)
{
case 0:
break;
case 1:
--m;
n += 2;
break;
case 2:
if(m>1)
{
m -= 2;
n = 4;
}
m = 0;
if(t%3 == 0)
n = t/3;
else
{
n = t/3;
n++;
}
break;
}
int g = n*3;
if(g%5==0)
{
m = g/5;
n = 0;
}
}

int main()
{
int t = 100;
int m,n;
f(t,m,n);
// int a=m,b=n;
printf("the less number five:%d    three:%d\n",m,n);
int c=0;
while(++c&&m>=0)
{
printf("%d :: five:%d    three:%d\n",c, m, n);
m -= 3;
n +=5;
}
/*
while(++c&&b>=0)
{
printf("%d :: five:%d    three:%d\n",c, a, b);
a += 3;
b -=5;
}
*/
return 0;
}

#8


UPCC真是厲害啊,一口氣回了多少了?

#9


-_-#

#10


UPCC老大
你真是太牛了

#11


強悍

#12


//嗯,編程編久了也不能忘了數學,數學是很有用的,特別是數論。
//簡潔是一種美,而且往往越簡潔越容易表現出思想
#include <stdio.h>
const int MaxCost = 99;  //最大郵資
int main()
{
    int count_3fen[5] = { 1, 2,  0, 2,  4 };
    int count_5fen[5] = { 0, -1, 1, 0, -1 };
    int base;
    for(int cost = 8;cost <= MaxCost;++cost){
        base = (cost - 8) % 5 ;
        printf("\t For the %d fen cost ,%d 3-fen and %d 5-fen stamps are needed ! \n",
            count_3fen[base],count_5fen[base] + cost / 8 );
    }
    return 0;
}

#13


Sorry ,方法不夠好(base可以省略),有些數值也弄錯了,改一改
#include <stdio.h>
const int MaxCost = 99;  //最大郵資
int main()
{
    int count_3fen[5] = { 0,  2,  4, 1,  2 };
    int count_5fen[5] = { 0, -1, -2, 0, -1 };
    for(int cost = 8;cost <= MaxCost;++cost){
        printf("\t For the %d fen cost ,%d 3-fen and %d 5-fen stamps are needed ! \n",
            count_3fen[cost],count_5fen[cost] + cost / 5 ;
    }
    return 0;
}

#14


唉,未測試版本好多錯誤,這個是測試過的:
#include <stdio.h>
const int MaxCost = 39;  //最大郵資
int main(int argc, char* argv[])
{
    static const int count_3fen[5] = { 0,  2,  4, 1,  3 };
    static const int count_5fen[5] = { 0, -1, -2, 0, -1 };
    for(int cost = 8;cost <= MaxCost;++cost){
        printf("For the %3d fen cost ,%5d  3-fen and %5d  5-fen stamps are needed ! \n",cost,
            count_3fen[cost % 5],count_5fen[cost % 5] + cost / 5 );
    }
    return 0;
}

#15


pkd(MFC&STL):請問你的“張數最少的買法”怎么得到??
我的那個函數應該也是有數學基礎的吧,其他的其實只是個喜歡給出,而且我的循環給出“買數”你相當你的for()//不過沒有你好,但我得到了“張數最少的買法”

你的代碼總體的確比我的優美了,但你差了“張數最少的買法”,所以你的代碼就不完美了!假如你可以解決“張數最少的買法”的話,的確你的程序真的不錯,值得學習

附:我回復那么多次不是因為沒有思考,而是剛好在吃飯,女朋友吵我吃飯,我一邊吃飯就一邊錯誤咯

#16


你們好NB啊

教教我撒

#17


線性問題求解啊,呵呵


目標: min(x+y)

約束: 3x+5y>8

#18


我也寫了一個,大家看看思路是否可以,有錯誤的話請大家指正

#include "stdio.h"
int five_num=0;
int three_num=0;
void num(int inputvalue)
{
    while (inputvalue)
    {
        switch (inputvalue)
        {
            case 9 :
                three_num+=3;
                break;
            case 10 :
                five_num+=2;
                break;
            case 11 :
                three_num+=2;
                five_num+=1;
                break;
            case 12 :
                three_num+=4;
                break;
            case 13 :
                three_num+=1;
                five_num+=2;
                break;
        }
        if (inputvalue>13)
        {
            inputvalue-=5;
            five_num++;
        }
        else
            break;
    }
}
main()
{
    int value;
    printf("enter a value:");
    scanf("%d",&value);
    num(value);
    printf("5 num:%d\n",five_num);
    printf("3 num:%d\n",three_num);
}

#19


TO:  UPCC(雜食動物) 
我的算法的思想是:從8到12分的買法確定下來,以后每增加5分,就相當於多買一張5分的郵票,寫出算法,優化后就得到了。
算法得到的也是張數最少的買法,當然前提是數額剛剛好。如果單純為了張數最少,那么就沒有意義了,直接就是:cost/5 + (cost%5)?1:0 ;

#20


暈了,不好意思,只看到最少,沒看到還要全部組合

#21


全部組合只要把3個5換成5個3就是了,不斷換下去,真到5人郵票少於3張。

#22


NB 佩服啊

#23


蠻簡單
int main()
{
int i, j, k, m, n;
scanf("%d", &n);
for (i=0, m=j=n/3; i<=j; i++)
{
if ((k = n-i*3)%5 == 0)
{
k = i+k/5;
printf("5:%d\t3:%d\n", k-i, i);
m = (k < m ? k : m);
}
}
printf("min = %d\n", m);
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com