| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1012 人关注过本帖
标题:贪心法举例求解???
只看楼主 加入收藏
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
贪心法举例求解???
请在整数n=92081346718538中删除10个数字,使得余下的数字按原次序组成的新数最大。要求如下:
(1)整数n和删除数字的个数“10”在源程序中完成赋值,程序直接输出运行结果;
(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最大数。
(提示:整数n可以以字符数组的方式定义、赋值和处理)
我的算法:(做了一半,但没有输出)
#include <stdio.h>
main()
{
 int a[]={7,4,2,6,8,3,6,1,3,9,8,4,},i,x,y,z,min=0,n=0,b=8;
 for(i=0;i<9;i++)
  for(x=i+1;x<10;x++)
   for(y=i+2;y<11;y++)
    for(z=i+3;z<12;z++){
     n=(a[i]*1000+a[x]*100+a[y]*10+a[z]);
     if(min>n)
      {
          min=n;
            printf("%d",min);
            getch();
      }
    }

}
别人用贪心法做的,但看不懂
经典问题 贪心法
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
 int i,m=8,t=0;
 char p[1005];
 string s("742683613984");
 for (i=0;i<s.length();i++)
 {
  while(t&&p[t-1]>s[i]&&m)
  {
      t--,m--;
      cout<<p[t];
      if(m)cout<<",";
  }
  p[t++]=s[i];
 }
 p[t]=0;
 cout<<endl;
 puts(p);
 return 0;
}
搜索更多相关主题的帖子: include 源程序 
2012-10-29 20:55
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
不好意思  才发现提给错了
原题如下:请在整数n=742683613984中删除8个数字,使得余下的数字按原次序组成的新数最小。要求如下:
(1)整数n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;
(2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。
(提示:整数n可以以字符数组的方式定义、赋值和处理)
2012-10-29 20:56
pingheng74
Rank: 2
等 级:论坛游民
帖 子:6
专家分:10
注 册:2011-7-1
收藏
得分:10 
2012-10-29 20:59
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
回复 3楼 pingheng74
什么意思?
2012-10-29 21:03
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
好吧   谁能告诉我我做的方法哪里错了呢?
2012-10-30 08:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 

DO IT YOURSELF !
2012-10-30 08:41
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
自己又做了一遍,但还是有错误   望指正.
程序代码:
#include <stdio.h>
main()
{

 int a[]={7,4,2,6,8,3,6,1,3,9,8,4};

 int i,x,y,z;  //定义了需要删除的四个数的下标
 int min=9999,n=0,b=8,s[4];

 for(i=0;i<9;i++)
  for(x=i+1;x<10;x++)
   for(y=i+2;y<11;y++)
    for(z=i+3;z<12;z++){
    n=(a[i]*1000+a[x]*100+a[y]*10+a[z]);

     if(min>n)
      {
          min=n;
          s[]={a(i),a(x),a(y),a(z)};  //此处有错误....

      }
    }
       printf("%f",s[])
       printf("%d",min);

}
2012-10-30 10:38
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
小小的改动了一下  你原代码错误多多  呵呵

#include <stdio.h>
#include <math.h>

void main()
{
int aa[]={7,4,2,6,8,3,6,1,3,9,8,4};
int i,x,y,z;  //定义了需要删除的四个数的下标
int min=9999,n=0,b=8,ss[4];
for(i=0;i<9;i++)
  for(x=i+1;x<10;x++)
   for(y=i+2;y<11;y++)
    for(z=i+3;z<12;z++){
    n=(aa[i]*1000+aa[x]*100+aa[y]*10+aa[z]);

     if(min>n)
      {
          min=n;
          ss[0]=aa[i];
          ss[1]=aa[x];
          ss[2]=aa[y];
          ss[3]=aa[z];  

      }
    }
       printf("%5d%5d%5d%5d\n",ss[0],ss[1],ss[2],ss[3]);
       printf("%d\n",min);
       //这里这样替换也可以
       //for(int zz=0;zz<4;zz++) printf("%5d",ss[zz]);
       //printf("\n");
       //printf("%d\n",min);


}

[ 本帖最后由 wp231957 于 2012-10-30 11:28 编辑 ]

DO IT YOURSELF !
2012-10-30 10:54
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
回复 8楼 wp231957
谢谢纠正  但是又发现题目是让输出删除的8个数字,看来程序还是不行
我再看看能不能改一下。
再次感谢!!!
2012-10-30 11:39
i东方
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-10-29
收藏
得分:0 
回复 8楼 wp231957
  还有  改成字符串输出怎么又不行了呢?
程序代码:
#include <stdio.h>
main()
{

 char a[]="742683613984";

 char s[4];

 int i,x,y,z;  //定义了需要删除的四个数的下标
 int min=9999,n=0,b=8;

 for(i=0;i<9;i++)
  for(x=i+1;x<10;x++)
   for(y=i+2;y<11;y++)
    for(z=i+3;z<12;z++)
    {
    n=(a[i]*1000+a[x]*100+a[y]*10+a[z]);

     if(min>n)
      {
          min=n;
          s[0]=a[i];
          s[1]=a[x];
          s[2]=a[y];
          s[3]=a[z]; 

      }
    }
       printf("%s\n",s);
       printf("%d",min);

}
2012-10-30 11:43
快速回复:贪心法举例求解???
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016244 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved