ACdream(12) f题

题意:给你一个数让你分解成几个含61的数




题解:首先判断是否本身是61数

如果不是:

6161以上的数可以直接分解为两个数

若一个数*******

(*******-6161)=&&&&&&&

那么解就是&&&&&61 和61&&

       6161以下的数使用背包处理

首先判断是否为61数,如果是就是一个背包的物品

把所有物品做一个完全背包再记录状态转移

jd函数判断数x是否为61数

deal分解6161以下的数

t数组记录状态转移

f数组做一个完全背包


#include<iostream>
#include<cstdio>
using namespace std;

bool jd(int x){
    int temp=x;
    while(temp!=0){
        if(temp%100==61)return true;
        else temp/=10;
    }
    return false;
}
int f[10000],t[10000]; 
int queue[10000],node;

void deal(int x){
    int queue[6600],l,r;
    l=0;r=1;
    queue[0]=x;
    while(l!=r){
    if(f[t[queue[l]]]==1)printf(" %d",t[queue[l]]);
    else queue[r++]=t[queue[l]];
    
    if(f[queue[l]-t[queue[l]]]==1)printf(" %d",queue[l]-t[queue[l]]);
    else queue[r++]=queue[l]-t[queue[l]];
    l++;
    }
    
}



int main(){
    int i,j,a,b,k,m,n,t1,num,temp,x,ans;
    scanf("%d",&t1);
    node=0;
    for(i=1;i<=6161;i++)
        if(jd(i)){f[i]=1;queue[++node]=i;}
    for(i=1;i<=node;i++)

        for(j=i;j<=6161;j++)
            if(f[j])
                if(queue[i]+j<6161)
                if(f[queue[i]+j]==0||f[queue[i]]+f[j]<f[queue[i]+j]){                        
                    f[queue[i]+j]=f[queue[i]]+f[j];
                    t[queue[i]+j]=j;
                }
    
    
    
    for(k=1;k<=t1;k++){
        scanf("%d",&num);if(jd(num))printf("1 %d\n",num);
        else
        if(num>=6161){
            temp=num;
            temp-=6161;
            a=61;
            b=6100;
            b+=temp%100;
            a+=temp/100*100;
            printf("2 %d %d\n",a,b);
        }
        else{
            temp=num;
            printf("%d",f[temp]);
            if(f[temp])deal(temp);
            printf("\n");
            
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值