题目描述:刘汝佳紫书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;
}