cxxiaoguo


私信TA

用户名:guowenwu

访问量:31177

签 名:

累死自己卷死你们

等  级
排  名 126
经  验 7464
参赛次数 8
文章发表 62
年  龄 0
在职情况 学生
学  校 成都信息工程大学
专  业 人工智能

  自我简介:

解题思路:

注意事项:

参考代码:

import java.util.Scanner;
public class Main {
private static int[] a;
private static int n;
private static int k;
private static int max=0;
private static int[] b=new int[100];
public static void main(String[] args) {
   Scanner input=new Scanner(System.in);
   n=input.nextInt();
   k=input.nextInt();
  a=new int[40]; //存可能的面值
  a[0]=1;  //必须有面值1
  dfs(1);  //开始搜索,从第二个面值开始枚举
  for (int i = 0; i <k; i++) {
System.out.print(b[i]+" ");
}
  System.out.println("\nMAX="+max);
}
private static void dfs(int i) {
if(i==k){//举例完k种
chexk();
}else{
for(int j=a[i-1]+1;j<=a[i-1]*n+1;j++){//下一个面值一定在上一个面值+1到上一个面值*最多贴的张数+1之间
a[i]=j;
dfs(i+1);
}
}
}
private static void chexk() {//动态规划求最大值
int dp[]=new int[1000];//最大连续尽量大一点,避免越界。下标i表示当前邮资,dp[i]表示所需最少张数
dp[0]=0;//邮资为零时一定是零张
int i=0;
while(dp[i]<=n){//当最少张数大于最多可贴张数时跳出
i++;
dp[i]=99999;//假设当前邮资下需要贴99999张邮票
for(int j=0;j<k&&a[j]<=i;j++){//寻找所有的邮票,且这张邮票的面值不大于当前的邮资
if(dp[i-a[j]]+1<dp[i])//当前邮资减去这张邮票面值张数加一如果小于当前邮资现用组合张数,则替换
dp[i]=dp[i-a[j]]+1;
}
}
if(i-1>max){
max=i-1;
for (int j = 0; j <k; j++) {
b[j]=a[j];
}
}
}
}


 

0.0分

6 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

那个,给个建议哈,作者可以把代码格式搞好点,加上缩进,我们这些读者会看得舒服点
2019-11-24 14:08:56
太棒了,大神啊,66666666666666666666,我把你的代码在纸上抄了几遍才懂,赫然间惊为天人
2019-07-15 09:44:06
  • «
  • 1
  • »