题意:
在一个国家有有
种货币,分别是价值为
的货币,现在你在超市买东西,你需要支付
元,问你和货员在这个过程中用到的总票数最小是多少张。
思路:
从低位到高位,每一位只有两种选择,
1、支付
张
2、支付1张
,找给
张
的货币。
我们设
表示用第一种方法的最小票数,
表示取第二种方法的最小票数。
char s[N];
ll dp[N][2];
int main(){
s[0] = '0';
cin >> (s + 1);
int l = strlen(s + 1);
dp[l][0] = s[l] - '0';
dp[l][1] = 10 - (s[l] - '0');
for(int i = l - 1;i >= 0;i --){
dp[i][0] = min(dp[i+1][0] + s[i] - '0',dp[i+1][1] + s[i]-'0' + 1);
dp[i][1] = min(dp[i+1][0] + 10 - (s[i]-'0'),dp[i+1][1] + (10 - (s[i]-'0'+1)));
}
cout <<min(dp[0][0],dp[0][1]);
}