公司發了某商店的購物券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...