★问题描述:
某宠物公司给每只宠物都取了一个名字,名字由字母组成,每只宠物的名字
都必须不同。为了方便管理,公司现在需要将每只宠物的名字都刻在铁链上,雕刻每个字母的费用是不同的,为了减少开支,公司现在请你帮他们的宠物取名字,使总费用最少。
★实验任务:
对于给定的字母的花费,给n只宠物取名字,使总花费最小。
★数据输入:
第一行有两个整数n(1<=n<=10000),m(1<=m<=5000),表示有n只宠物需要取名,总共有m个字母,接下来一行有m个数表示雕刻每个字母所需的费用,每个字母的费用不大于100。
★结果输出:
将计算出的最小总花费输出到文件output.txt。
输入示例输出示例
input.txt
4 3
1 2 4
output.txt
8
最小花费问题,C或C++
答案:1 悬赏:80
解决时间 2021-01-04 14:29
- 提问者网友:你在我心中是最美
- 2021-01-03 23:48
最佳答案
- 二级知识专家网友:猎杀温柔
- 2021-01-04 00:44
输出到文件你自己改一下:
#include
#include
int* nbegin;
int* nend;
int c;
int sum;
int sumof(int* begin, int* end)
{
int i = 0;
while(begin != end)
i += *begin++;
return i;
}
int pred(const void* a, const void* b)
{
return *(const int*)a - *(const int*)b;
}
int get(int* begin, int* end, int ps, int* n)
{
int *p1,*p2;
int cur, added;
for(p1 = begin; p1 != end; ++p1)
{
added = 0;
cur = *p1 + sumof(nbegin, nend);
if(cur <= ps) {
*nend++ = *p1;
added = 1;
if(cur == ps) {
printf("第%d个名字: ", ++c);
for(p2 = nbegin; p2 != nend; ++p2)
printf("%d", (sum += *p2, *p2));
putchar('\n');
if(--*n <= 0) {
printf("整合最小花费: %d", sum);
return 0;
}
}
if(!get(begin, end, ps, n))
return 0;
}
if(added)
nend--;
}
return 1;
}
int main()
{
int* a, *p;
int n, m, i;
scanf("%d%d", &n, &m); // 输入n和m
a = (int*)malloc(sizeof(int)*m);
for(i = 0; i < m; ++i) // 输入m个字母
scanf("%d", &a[i]);
qsort(a, m, sizeof(int), pred);
nbegin = (int*)malloc(sizeof(int)*n);
nend = nbegin;
for(i = a[0]; i <= 0xFFFFFFF; ++i) {
for(p = a; p != a + n; ++p)
if(*p > i)
break;
if(!get(a, p, i, &n))
break;
}
free(a);
free(nbegin);
return 0;
}
#include
#include
int* nbegin;
int* nend;
int c;
int sum;
int sumof(int* begin, int* end)
{
int i = 0;
while(begin != end)
i += *begin++;
return i;
}
int pred(const void* a, const void* b)
{
return *(const int*)a - *(const int*)b;
}
int get(int* begin, int* end, int ps, int* n)
{
int *p1,*p2;
int cur, added;
for(p1 = begin; p1 != end; ++p1)
{
added = 0;
cur = *p1 + sumof(nbegin, nend);
if(cur <= ps) {
*nend++ = *p1;
added = 1;
if(cur == ps) {
printf("第%d个名字: ", ++c);
for(p2 = nbegin; p2 != nend; ++p2)
printf("%d", (sum += *p2, *p2));
putchar('\n');
if(--*n <= 0) {
printf("整合最小花费: %d", sum);
return 0;
}
}
if(!get(begin, end, ps, n))
return 0;
}
if(added)
nend--;
}
return 1;
}
int main()
{
int* a, *p;
int n, m, i;
scanf("%d%d", &n, &m); // 输入n和m
a = (int*)malloc(sizeof(int)*m);
for(i = 0; i < m; ++i) // 输入m个字母
scanf("%d", &a[i]);
qsort(a, m, sizeof(int), pred);
nbegin = (int*)malloc(sizeof(int)*n);
nend = nbegin;
for(i = a[0]; i <= 0xFFFFFFF; ++i) {
for(p = a; p != a + n; ++p)
if(*p > i)
break;
if(!get(a, p, i, &n))
break;
}
free(a);
free(nbegin);
return 0;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |