CODEVS——T 1005 生日礼物
http://codevs.cn/problem/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 Input2 3
2 1 2
4 8 4
5 5
樣例輸出?Sample Output36
數據范圍及提示?Data Size & Hint?
1 #include <cstdio> 2 3 int n,m,ans=1<<30; 4 int a[26][26],b[26],sum[26]; 5 6 bool check() 7 { 8 for(int i=1;i<m;i++) 9 if(sum[i]!=sum[i+1]) 10 return false; 11 return true; 12 } 13 void DFS(int now) 14 { 15 // if(ans!=(1<<30)) return ; 16 for(int i=0;i<=b[now];i++) 17 { 18 for(int j=1;j<=m;j++) 19 sum[j]+=a[now][j]*i; 20 if(now<n) DFS(now+1); 21 else 22 { 23 if(check()) 24 { 25 if(sum[1]>0&&sum[1]*m<ans) 26 ans=sum[1]*m; 27 } 28 } 29 for(int j=1;j<=m;j++) 30 sum[j]-=a[now][j]*i; 31 } 32 } 33 34 int main() 35 { 36 scanf("%d%d",&n,&m); 37 for(int i=1;i<=n;i++) 38 for(int j=1;j<=m;j++) 39 scanf("%d",&a[i][j]); 40 for(int i=1;i<=n;i++) scanf("%d",b+i); 41 DFS(1); 42 if(ans<=1000) printf("%d\n",ans); 43 else printf("alternative!"); 44 return 0; 45 }?
轉載于:https://www.cnblogs.com/Shy-key/p/7466869.html
總結
以上是生活随笔為你收集整理的CODEVS——T 1005 生日礼物的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【正点原子FPGA连载】第三十五章高速A
- 下一篇: 深度优先和广度优先的区别 笔记