input | output |
---|---|
2 10 6 20 15 100 100 100 |
Minimum possible cost: 505.00 |
2 10 5 30 14 1 20 20 |
Maximum possible amount: 6 Minimum possible cost: 130.00 |
1 /** 2 Create By yzx - stupidboy 3 */ 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cmath> 8 #include <deque> 9 #include <vector> 10 #include <queue> 11 #include <iostream> 12 #include <algorithm> 13 #include <map> 14 #include <set> 15 #include <ctime> 16 #include <iomanip> 17 using namespace std; 18 typedef long long LL; 19 typedef double DB; 20 #define For(i, s, t) for(int i = (s); i <= (t); i++) 21 #define Ford(i, s, t) for(int i = (s); i >= (t); i--) 22 #define Rep(i, t) for(int i = (0); i < (t); i++) 23 #define Repn(i, t) for(int i = ((t)-1); i >= (0); i--) 24 #define rep(i, x, t) for(int i = (x); i < (t); i++) 25 #define MIT (2147483647) 26 #define INF (1000000001) 27 #define MLL (1000000000000000001LL) 28 #define sz(x) ((int) (x).size()) 29 #define clr(x, y) memset(x, y, sizeof(x)) 30 #define puf push_front 31 #define pub push_back 32 #define pof pop_front 33 #define pob pop_back 34 #define ft first 35 #define sd second 36 #define mk make_pair 37 inline void SetIO(string Name) 38 { 39 string Input = Name+".in", 40 Output = Name+".out"; 41 freopen(Input.c_str(), "r", stdin), 42 freopen(Output.c_str(), "w", stdout); 43 } 44 45 46 inline int Getint() 47 { 48 int Ret = 0; 49 char Ch = ‘ ‘; 50 bool Flag = 0; 51 while(!(Ch >= ‘0‘ && Ch <= ‘9‘)) 52 { 53 if(Ch == ‘-‘) Flag ^= 1; 54 Ch = getchar(); 55 } 56 while(Ch >= ‘0‘ && Ch <= ‘9‘) 57 { 58 Ret = Ret * 10 + Ch - ‘0‘; 59 Ch = getchar(); 60 } 61 return Flag ? -Ret : Ret; 62 } 63 64 const int N = 1010; 65 int n, m; 66 DB Arr[N][3], Dp[N][N]; 67 68 inline void Input() 69 { 70 scanf("%d%d", &n, &m); 71 For(i, 1, n) 72 Rep(j, 3) scanf("%lf", &Arr[i][j]); 73 } 74 75 inline void Solve() 76 { 77 Dp[0][0] = 0; 78 For(i, 1, m) Dp[0][i] = 1.0 * INF; 79 DB Delta, x, Cnt; 80 int Len = 0; 81 For(i, 1, n) 82 { 83 For(j, 0, m) Dp[i][j] = Dp[i - 1][j]; 84 if(Arr[i][0] > 1) Delta = (Arr[i][2] - Arr[i][1]) / (Arr[i][0] - 1); 85 86 x = Cnt = Arr[i][1]; 87 For(j, 1, Arr[i][0]) 88 { 89 For(k, 0, Len) 90 if(Dp[i][k + j] > Dp[i - 1][k] + x) 91 Dp[i][k + j] = Dp[i - 1][k] + x; 92 Cnt += Delta; 93 x += Cnt; 94 } 95 96 Len += Arr[i][0]; 97 if(Len > m) Len = m; 98 } 99 100 if(Len < m) 101 printf("Maximum possible amount: %d\n", Len); 102 printf("Minimum possible cost: %.2f\n", Dp[n][Len]); 103 } 104 105 int main() 106 { 107 #ifndef ONLINE_JUDGE 108 SetIO("E"); 109 #endif 110 Input(); 111 Solve(); 112 return 0; 113 }
原文:http://www.cnblogs.com/StupidBoy/p/4999160.html