小A點菜 水題 dp 揹包
阿新 • • 發佈:2019-02-08
基本上還是01揹包,首先注意必須正好花光錢,所以初始化時除了dp[0]以外其他都要設定成inf,然後因為求方案數,所以基本方程為dp[i] = dp[i-x] + dp[i],再根據inf進行一些特殊處理即得解
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxm = 10000 + 500; 6 const int inf = 0x7fffffff >> 1; 7 int dp[maxm]; 8 int n, m; 9 int x;10 11 int main () { 12 scanf("%d %d", &n, &m); 13 for (int i = 1; i <= m; i++) dp[i] = inf; 14 dp[0] = 1; 15 for (int i = 1; i <= n; i++) { 16 scanf("%d", &x); 17 for (int j = m; j >= x; j--) { 18 if (dp[j - x] == inf) continue; 19 if(dp[j] == inf) dp[j] = dp[j-x]; 20 else dp[j] += dp[j-x]; 21 } 22 } 23 if (dp[m] == inf) printf("0"); 24 else printf("%d", dp[m]); 25 return 0; 26 }