题目链接:http://codeforces.com/problemset/problem/1214/A
题意:有n个卢布,要换成美元和欧元,使手上剩余的卢克最少。一美元价值d卢布,一欧元价值e卢克。
分析:欧元的面值最小为5,其实的都少5的倍数,美元最小面值为1。其实这里就可以转换成2个物品的无限背包问题,然而n值较大,背包算法不合适。只有2个物品,暴力枚举即可。
解法1:动态规划,无法通过。
#include <iostream>
#include <queue>
#include <functional>
#include <cstring>
using namespace std;
const int maxn = 10000;
int vis[maxn], dp[maxn];
int v[maxn], w[maxn];
int n, c;
int mydp(int c)
{
int &ans = dp[c];
if (ans != -1)
return ans;
ans = 0;
for (int i = 0; i < n; i++)
{
if (c >= v[i])
{
ans = max(ans, mydp(c - v[i]) + w[i]);
}
}
return ans;
}
int main()
{
int d,e;
cin >>c>>d>>e;
n=2;
v[0]=d;w[0]=d;
v[1]=e*5;w[1]=e*5;
memset(dp, -1, sizeof(dp));
cout<<c-mydp(c);
return 0;
}
解法2:枚举AC
#include <iostream>
#include <queue>
#include <functional>
#include <cstring>
using namespace std;
const int maxn = 10000;
int vis[maxn], dp[maxn];
int v[maxn], w[maxn];
int n, c;
int mydp(int c)
{
int &ans = dp[c];
if (ans != -1)
return ans;
ans = 0;
for (int i = 0; i < n; i++)
{
if (c >= v[i])
{
ans = max(ans, mydp(c - v[i]) + w[i]);
}
}
return ans;
}
int main()
{
int d,e;
cin >>c>>d>>e;
n=2;
v[0]=d;w[0]=d;
v[1]=e*5;w[1]=e*5;
memset(dp, -1, sizeof(dp));
cout<<c-mydp(c);
return 0;
}