CODEVS——T 1297 硬幣
阿新 • • 發佈:2017-09-12
div 可能性 solution icon all 空間 cst 差距 輸入
輸入描述 Input Description
http://www.codevs.cn/problem/1297/
時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description我們知道即使是同一種面值的硬幣,它們的重量也有可能不一樣,因為它受到許多因素的影響,包括制造工藝和流程上的。但是任何一種面值的硬幣的重量總是處於某個特定範圍之內。現在已知所有面值的硬幣的重量範圍。給定一堆硬幣的總重量,問這堆硬幣的總價值有多少種不同的可能。舉例:已知一角硬幣的重量在19到21之間,五角硬幣的重量在40到43之間。有一堆硬幣的總重量為99。則它可以由4個重量為20,1個重量為19的一角硬幣組成,其總價值為5角,也可以由1個重量為42的五角硬幣和3個重量為19的一角硬幣組成,其總價值為8角,再或者由2個重量為40的五角硬幣和1個重量為19的一角硬幣組成,其總價值為1塊1角。因此這堆硬幣的總價值共有3種不同的可能。
第一行是一個整數w(10<=w<=100)表示所有硬幣的總重量。第二行是一個整數n(1<=n<=7)表示不同面值的硬幣總數。接下來n行每行3個整數,依次表示硬幣的面值,最小可能重量和最大可能重量。硬幣面值不超過50,最小重量不低於2,最大重量不高於100。最大重量和最小重量之間的差距不超過30。
輸出描述 Output Description僅包括一行表示這堆硬幣的總價值有多少種不同的可能性。
樣例輸入 Sample Input99
2
1 19 21
5 40 43
樣例輸出 Sample Output3
數據範圍及提示 Data Size & Hint 二維數組記錄訪問狀態、 在一位數組上計較半天。。zz啊1 #include <algorithm> 2 #include <cstdio> 3 4 inline void read(int &x) 5 { 6 x=0; register char ch=getchar(); 7 for(; ch>‘9‘||ch<‘0‘; ) ch=getchar(); 8 for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘; 9 } 10 11 int n,w,ans,cnt,ca; 12 int cw[5001],cv[5001]; 13 bool get[5001],vis[126][5001]; 14 15 void DFS(int noww,int sumv) 16 { 17 if(vis[noww][sumv]) return ; 18 if(!noww) 19 { 20 if(!get[sumv]) ans++; 21 get[sumv]=1; 22 return ; 23 } 24 vis[noww][sumv]=1; 25 for(int i=1; i<=cnt; ++i) 26 if(noww>=cw[i]) 27 DFS(noww-cw[i],sumv+cv[i]); 28 } 29 30 int AC() 31 { 32 read(w),read(n); 33 for(int val,l,r,i=1; i<=n; i++) 34 { 35 read(val),read(l),read(r); 36 for(int j=l; j<=r; ++j) 37 cv[++cnt]=val,cw[cnt]=j; 38 } 39 DFS(w,0); 40 printf("%d\n",ans); 41 return 0; 42 } 43 44 int Aptal=AC(); 45 int main(){;}
CODEVS——T 1297 硬幣