C语言一菜鸟级


私信TA

用户名:LHL

访问量:66231

签 名:

AC总是意料之外 ^_^

等  级
排  名 53
经  验 11536
参赛次数 5
文章发表 56
年  龄 24
在职情况 在职
学  校 四川工商学院
专  业 通信工程

  自我简介:

C语言 蓝桥杯 ACM 新人 欢迎大佬 前来指导 交流 本人 博客https://fivecc.blog.csdn.net/

解题思路:动态规划

注意事项:

参考代码:

#include <stdio.h>
int main()
{long int a[101];//存放邮票面值 
long int s[30000];// s[i]序号 i 代表可能从1 2 3.。。。i 序列的数字值 
  long int m,n,i,j,t,max1=0,maxsl;// s[i]存放的是构成需要的邮票最小张数 
  scanf("%ld\n%ld",&n,&m);
  for(i=1;i<=m;i++)
  {scanf("%ld",&a[i]);
  if(max1<a[i])max1=a[i];//找出最大面值 
  }
  s[0]=0;maxsl=n*max1;//初始 构成 0 需要 0张邮票 
  for(i=1;i<=n*max1;i++)//能达到的最大数值 
  {   t=n+1;
  for(j=1;j<=m;j++)
  if((i-a[j])>=0)//当邮票面值小于 构成 数字值时才可用不然就超了 
  { s[i]=1+s[i-a[j]];// 若把当前符合条件的面值a[j]贴上则  还需要 面值为 i-a[j]的 
     if(t>s[i])t=s[i];//面值集来凑 构成这样面值的 前面已经求过直接把最小张数加上 
  }                  //就是当前最小张数
  s[i]=t;//t代表当前最小张数; 
  if(s[i]>n){ maxsl=i-1;break; }//若构成当前 i 的最小张数s[i]都大于了 
  }                               //最大使用张数则当前 i 无法构成 因此序列只能i-1 
   
  
  printf("%ld\n",maxsl);
  
return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »