1. 程式人生 > >CODEVS——T 1297 硬幣

CODEVS——T 1297 硬幣

div 可能性 solution icon all 空間 cst 差距 輸入

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種不同的可能。

輸入描述 Input Description

第一行是一個整數w(10<=w<=100)表示所有硬幣的總重量。第二行是一個整數n(1<=n<=7)表示不同面值的硬幣總數。接下來n行每行3個整數,依次表示硬幣的面值,最小可能重量和最大可能重量。硬幣面值不超過50,最小重量不低於2,最大重量不高於100。最大重量和最小重量之間的差距不超過30。

輸出描述 Output Description

僅包括一行表示這堆硬幣的總價值有多少種不同的可能性。

樣例輸入 Sample Input

99

2

1 19 21

5 40 43

樣例輸出 Sample Output

3

數據範圍及提示 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 硬幣