藍橋杯之買商品

2021-07-26 04:34:34 字數 1836 閱讀 8955

公司發了某商店的購物券1000元,限定只能購買店中的m種商品。每種商品的**分別為m1,m2,…,要求程式列出所有的正好能消費完該購物券的不同購物方法。

程式輸入:

第一行是乙個整數m,代表可購買的商品的種類數。

接下來是m個整數,每個1行,分別代表這m種商品的單價。

程式輸出:

第一行是乙個整數,表示共有多少種方案

第二行開始,每種方案佔1行,表示對每種商品購買的數量,中間用空格分隔。

例如:

輸入:

2 200

300

則應輸出:

2 2 2

5 0

做這道題有三種

第一種

#include 

using

namespace

std;

int price[100] = ;

int num[100];

int m = 0;

int count = 0;

int slove(int money)

if(money==1000)

// 切記不要用這種方法寫,會導致重複

for(int i = 0; i < m ; i++)

return0;}

int main()

總結:這種方法會將有重複如商品1為0 商品2為0 那麼2 2就會有六種二叉樹,這種方法使用於有序的排列組合

0011 0101 0110 1100 1010 1001

第二種

#include 

#define n 20

int way[n][n] = ;

int num[n] = ;

int price[n]=;

int count = 0;

int n;

void buy(int money,int i);

void print();

int main()

buy(0,0);

print();

return0;}

void buy(int money,int i)

printf("\n");}}

總結這種方法在所在的分支上只會往靠向右邊子樹枝遞進 使用於無序排序

如0011 之後不會出現 0101 這裡的第三個數的0不會出現只會出現1或2(被排除)

第三種(回溯)

#include 

#include

using

namespace

std;

int num[100] = ;

int price[100] =;

int count = 0;

int m;

int check()

return money;

}void dfs()

if(check()==1000)

else

if(check()<1000&&k//注意這裡是m

else

}}int main()

dfs();

return

0; }

總結:回溯法進行剪枝功能,所對應的二叉樹與前面的不同

這三道題目的圖(畫的不太好)

這道題只實用於第二個和第三個程式

藍橋杯 幼兒園買玩具

蒜廠幼兒園有 n 個小朋友,每個小朋友都有自己想玩的玩具。身為幼兒園園長的你決定給幼兒園買一批玩具,由於經費有限,你只能買 m 個玩具。已知玩具商店一共賣 k 種玩具,編號為 1,2,3,k,你讓每個小朋友把想玩的玩具編號都寫在了紙上。你希望滿足盡可能多的小朋友的需求,請計算出最多同時能滿足多少個小...

藍橋杯之迷宮

請提交該整數,表示走出迷宮的玩家數目,不要填寫任何多餘的內容。思路 本來想的是類似求解迷宮問題的深搜,發現它無法遍歷每個點,還不如兩層迴圈來得快,判斷每個點,然後用深搜,每走一步標記陣列對應值改變為 1,超出邊界符合題意,移動到標記陣列值為 1 則表示兜圈子,直到所有點判斷結束。include us...

藍橋杯訓練之ACM

題目內容 現有長度為n 的字串,該字串只由 a c m 三種字元組成 可以只有其中一種或兩種字元,但絕對不能有其他字元 但是禁止在串中出現c 相鄰的情況,求一共有多少種滿足要求的不同的字串。例如 n 2 時,有aa,ac,am,ca,cm,ma,mc,mm 8 種情況。輸入描述 長度整數n n 40...