2011 藍橋杯【初賽試題】 程序設計題二
公司發了某商店的購物券1000元,限定隻能購買店中的m種商品。每種商品的價格分別為m1,m2,…,要求程序列出所有的正好能消費完該購物券的不同購物方法。
程序輸入:
第一行是一個整數m,代表可購買的商品的種類數。
接下來是m個整數,每個1行,分別代表這m種商品的單價。
程序輸出:
第一行是一個整數,表示共有多少種方案
第二行開始,每種方案占1行,表示對每種商品購買的數量,中間用空格分隔。
例如:
輸入:
2
200
300
則應輸出:
2
2 2
5 0
輸入:
2
500
800
則應輸出:
1
2 0
#include<stdio.h> #include<string.h> int cost; int n;//物品個數 int price[2000];//物品單價 int num[100];//物品數目 int sum=0;//方案數目 int arg[100][100];//每種方案的商品分布 void Fun(int x)//遞歸,每件物品分為買或者不買的情況(同一物品可以買多次) { int i; if(cost>1000||x>=n) return; if(cost==1000) { for(i=0; i<n; i++) arg[sum][i] = num[i]; sum++; return; } num[x]++;//選擇這件商品的情況 cost+=price[x]; Fun(x);//還可能繼續選這件商品 num[x]--;//不選擇這件商品的情況 cost-=price[x]; Fun(x+1);//往下走 } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&price[i]); memset(num,0,sizeof(num));//數組清0為了之後的加減運算 Fun(0); printf("%d\n",sum); for(i=0;i<sum;i++) { printf("%d",arg[i][0]);//防止多輸出空格 for(j=1;j<n;j++) printf(" %d",arg[i][j]); puts(""); } return 0; }
參考:https://www.cnblogs.com/hxsyl/archive/2012/12/15/2819911.html
最後更新:2017-04-03 12:55:32