硬币问题

来源:互联网 发布:征途2挂机网络超时 编辑:程序博客网 时间:2024/06/03 18:20

题目描述:刘汝佳紫书262页

思想:固定长度的最长和最短路

求最长路的记忆化搜索方法

D[i]表示从当前节点i出发到达0的最长路径 注意D[0]必须赋予初始值因为0到0的路径长度为0 不然无法算出正确结果 (代码中把ans改到一个最大值就可以求出相应的最短路)

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100;int n, s,result;int Coin[maxn],Vis[maxn],D[maxn];int min_coin[maxn], max_coin[maxn];int minv[maxn], maxv[maxn];int dp(int s){    int &ans = D[s];    if (ans !=-1)//表示已经算过了    {        return ans;    }    ans = -(1<<20);//赋予一个不可能算出来的初始值    for (int i = 1; i <= n; i++)    {        if (s >= Coin[i])        {            ans = max(ans, dp(s - Coin[i]) + 1);        }    }    return ans;}int main() {    scanf("%d%d", &n,&s);    for (int i = 1; i <= n; i++)    {        scanf("%d", &Coin[i]);    }    memset(D, -1, sizeof(D));    D[0] = 0;    printf("%d ", dp(s));    system("pause");    return 0;}

最短路最长路的递推方法

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 10000;int n, s,result;int Coin[maxn],Vis[maxn],D[maxn];int min_coin[maxn], max_coin[maxn];int minv[maxn], maxv[maxn];int main() {    scanf("%d%d", &n,&s);    for (int i = 1; i <= n; i++)    {        scanf("%d", &Coin[i]);    }    //minv[0] = maxv[0] = 0;    for (int  i = 1; i <= s; i++)    {        minv[i] = maxn;        maxv[i] = -maxn;    }    for (int i = 1; i <= s; i++)    {        for (int j = 1; j <= n; j++)        {            if (i >= Coin[j])            {                minv[i] = min(minv[i], minv[i - Coin[j]] + 1);                maxv[i] = max(maxv[i], maxv[i - Coin[j]] + 1);            }        }    }    printf("min: %d  max: %d", minv[s], maxv[s]);    system("pause");    return 0;}
原创粉丝点击