CF1214A
CF1214A
题意:
有n个卢布,要换成美元和欧元,使手上剩余的卢布最少。一美元价值d卢布,一欧元价值e卢布。
解法:
可以看成只有两个没有代价的可以无限取的物品的完全背包。
CODE:
#include<bits/stdc++.h>
#define LL long long
#define N 100000010
using namespace std;
int n,d,e,cnt,dp[20];
bool vis[N];
const int dollar[50] = {0, 1, 2, 5, 10, 20, 50, 100};
const int eu[50] = {0, 5, 10, 20, 50, 100, 200};
inline void init() {
for(int i = 1; i <= 7; i++)
dp[++cnt] = d * dollar[i];
for(int i = 1; i <= 6; i++)
dp[++cnt] = e * eu[i];
vis[0] = 1;
}
int main() {
scanf("%d%d%d",&n,&d,&e);
init();
for(int i = 1; i <= cnt; i++) {
for(int j = dp[i]; j <= n; j++) {
if(vis[j - dp[i]]) vis[j] = 1;
}
}
for(int i = n; i >= 0; i--) {
if(vis[i] == 1) {
printf("%d\n", n - i);
break;
}
}
return 0;
}
有些路你和某人一起走,就长得离谱,你和另外一些人走,就短得让人舍不得迈开脚步。