1. 程式人生 > >HDU-2159

HDU-2159

pat break void ace ref 需要 name tar 背包問題

傳送門

限制最多買n件物品的完全背包,二維的完全背包

定義dp[i][j]為最多i忍耐度,打j只怪能獲得的最大經驗

兩種循環順序都可以

需要註意的是:完全背包問題限制條件的維度和物品編號的維度的循環先後順序是可以互換的.

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define INF 0x3f3f3f3f
 6 #define MOD 1000000007
 7 using namespace std;
8 typedef long long LL; 9 10 int ex, pat, kind, num; 11 const int maxn = 1e2 + 5; 12 int dp[maxn][maxn]; 13 int gt[maxn], lose[maxn]; 14 15 void solve() { 16 memset(dp, 0, sizeof(dp)); 17 for (int k = 0; k < kind; k++) { 18 for (int i = lose[k]; i <= pat; i++) { 19 for
(int j = 1; j <= num; j++) { 20 dp[i][j] = max(dp[i][j], dp[i - lose[k]][j - 1] + gt[k]); 21 } 22 } 23 } 24 /* 25 for (int i = 1; i <= pat; i++) { 26 for (int k = 0; k < kind; k++) { 27 for (int j = 1; j <= num; j++) { 28 if (i >= lose[k])
29 dp[i][j] = max(dp[i - lose[k]][j - 1] + gt[k], dp[i][j]); 30 } 31 } 32 } 33 */ 34 int i; 35 for (i = 1; i <= pat; i++) { 36 if (dp[i][num] >= ex) { 37 printf("%d\n", pat - i); 38 break; 39 } 40 } 41 if (i == pat + 1) puts("-1"); 42 } 43 44 45 int main(int argc, const char * argv[]) { 46 while (~scanf("%d%d%d%d", &ex, &pat, &kind, &num)) { 47 for (int i = 0; i < kind; i++) { 48 scanf("%d%d", &gt[i], &lose[i]); 49 } 50 solve(); 51 } 52 return 0; 53 }

HDU-2159