標籤:ace 問題 表達 body log span blog bre input
1005 生日禮物 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold題目描述 Description
9月12日是小松的朋友小寒的生日。小松知道小寒特別喜歡蝴蝶,所以決定折蝴蝶作為給小寒的生日禮物。他來到了PK大學最大的一家地下超市,在超市裡,小松找到了n種可以用來摺紙的本子。每種類型的本子裡有若干不同顏色的紙若干張,當然同種類型的本子一定是完全一樣的,而不同種類型的本子不一定完全不一樣。他統計了一下,這裡總共有n種不同類型的可以用來摺紙的本子,每種本子各有bi本,所有的紙中有m種顏色是小寒所喜歡的顏色。小松希望他折的每種顏色的蝴蝶的數目是一樣的。換句話說,小松必須折m*k只蝴蝶,其中k代表每種顏色蝴蝶的數目,這個數由小松自己來決定。但是小松又不能浪費紙,也就是說他買的本子中,只要是小寒喜歡的顏色的紙都要被折成蝴蝶。於是問題來了,每種類型的本子應該各買多少本,才能折出這m*k只蝴蝶呢?當然,由於小松是個很懶的人,他希望折的蝴蝶數目越少越好,只要表達了心意就可以了(也就是不能1隻也不折)。而如果小松總共必須折1000隻以上的蝴蝶才能滿足要求,那麼他就寧願換一種禮物的方案了。
輸入描述 Input Description
輸入的第一行包含2個整數n(1≤n≤8),m(1≤m≤10)。表示有n種不同類型的本子和m種小寒喜歡的顏色。接下來一個n*m的矩陣。第i行第j列的整數aij表示在第i種類型的本子中包含小寒喜歡的顏色j的紙有aij(1≤aij≤100)張。再接下來的一排n個整數b1到bn,表示每種顏色的本子在超市中有多少本(1≤bi≤5)。
輸出描述 Output Description
輸出包含一個整數,表示小松最少需要折的蝴蝶數目,如果該數目超過1000,則輸出”alternative!”。(由於可能存在多種買本子的方案,所以這裡就不要求輸出具體方案了)
範例輸入 Sample Input
2 3
2 1 2
4 8 4
5 5
範例輸出 Sample Output
36
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[10][12],f[12],sum[12],lim=1001;//限制邊界次數 題目要求不超過1000 5 int n,m; 6 void dfs(int s){ 7 for(int i=0;i<=f[s];i++){ 8 for(int k=1;k<=m;k++) 9 sum[k]+=a[s][k]*i;//每種顏色的本子的數目;10 if(s<n) dfs(s+1);11 else{12 int flag=0;13 for(int k=2;k<=m;k++){14 if(sum[k]!=sum[k-1]){15 flag=1;break;16 }17 }18 if(!flag)//每種顏色的本子的數目都一樣 sum[1..n]都可以 19 if(sum[1]*m<lim&&sum[1]>0)20 lim=min(lim,sum[1]*m);21 }22 for(int k=1;k<=m;k++)//回溯 23 sum[k]-=a[s][k]*i;24 }25 }26 int main(){27 scanf("%d%d",&n,&m);28 for(int i=1;i<=n;i++)//第i行第j列的整數aij表示在第i種類型的本子中包含小寒喜歡的顏色j的紙有aij(1≤aij≤100)張29 for(int j=1;j<=m;j++)30 scanf("%d",&a[i][j]);31 for(int i=1;i<=n;i++)//本子數目 32 scanf("%d",f+i);33 dfs(1);//從第一本開始搜 34 if(lim<=1000) printf("%d\n",lim);35 else printf("alternative!\n");36 return 0;37 }
Codevs 1005 生日禮物