/**********************************************************
贪心算法基本思想
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从
整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
***********************************************************/
/**********************************************************/
struct goods
{
int volume;
int value;
float v;
char no;
}g[N];
void Putin(goods *g,int n)
{
int i = 0;
int sumvu = 0,sumva = 0;
while(sumvu + g[i].volume <= M && i<n)
{
sumvu += g[i].volume; //记录货物的总体积
sumva += g[i].value; //货物总价值
i++;
}
cout<<"总体积为:"<<sumvu<<endl;
cout<<"总价值为:"<<sumva<<endl;
}
void Input(goods *g,int n)
{
int i = 0;
int volume[] = {40,55,20,55,30,40,45,55};
int value[] = {35,20,20,40,35,15,40,20};
char no[] = {'A','B','C','D','E','F','G','H'};
while(i < N)
{
g[i].volume = volume[i];
g[i].value = value[i];
g[i].no = no[i];
g[i].v = 1.0 * g[i].value / g[i].volume; //价重比
i++;
}
}
void Sort(goods *g,int n)
{
goods temp;
int i = 0,j = 0;
for (; i < n; i++)
{
for (j = 0; j < n - i - 1;j++)
{
if (g[j].v < g[j+1].v)
{
temp = g[j];
g[j] = g[j+1];
g[j+1] = temp;
}
}
}
}
int main()
{
Input(g,N);
Sort(g,N);
Putin(g,N);
return 0;
}
/*****************************************************************
从N位数字串中删去M个数使剩下的数字串所表示的数值最小。
******************************************************************/
#include "iostream"
#include "cstring"
using namespace std;
void deletechar(char *p) /*从字符串删除一个字符*/
{
while(*p)
{
*p = *(p+1);
p++;
}
}
int main()
{
char s[240];
int i,m;
cout<<"请输入数字串:";
cin>>s;
cout<<"请输入要删掉的个数:";
cin>>m;
while(m > 0)
{
i = 0;
while(i < (int)strlen(s) && (s[i] <= s[i+1]))
i++;
deletechar(&s[i]); //若串中某数不满足单调递增条件,删除此数
m--;
}
//删除串中高位的0
while(s[0] == '0')
deletechar(&s[0]);
if(strlen(s) != 0)
cout<<s<<endl;
else
cout<<"0"<<endl;
return 0;
}
/*****************************************************
贪心法相关理论
1.最小生成树的Prime和Kruskal算法
2.有向图最短路径的Dijkstra算法
3.囚徒困境
******************************************************/
贪心算法
最新推荐文章于 2025-04-17 20:00:00 发布