九度1209:最小郵票數-簡單dp
阿新 • • 發佈:2019-01-30
這道題就是一道簡單的二維dp,轉移方程為dp[i][j] = min(dp[i-a[j]][j-1]+1, dp[i][j]);//i>a[j]時
dp[i][j] = min(dp[i][j], dp[i][j-1]);
其中dp[i][j]表示用前j張郵票湊成數額為i的最小郵票數目,附上AC程式碼:
#include<bits/stdc++.h> using namespace std; int dp[110][25]; int a[25]; int main() { int m, n; while(~scanf("%d%d", &m, &n)) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) dp[i][j] = 1e9; for(int i = 1; i <= n; i++) dp[a[i]][i] = 1; for(int i = 1; i <= m; i++) { for(int j = 2; j <= n; j++) { //printf("aaa\n"); if(i > a[j]) dp[i][j] = min(dp[i-a[j]][j-1]+1, dp[i][j]); dp[i][j] = min(dp[i][j], dp[i][j-1]); //printf("dp[%d][%d]:%d\n", i, j, dp[i][j]); } } if(dp[m][n] == 1e9) printf("0\n"); else printf("%d\n", dp[m][n]); } return 0; }