• 完全背包输出方案数(dp)


    在一个10美元的商店里,所有东西都值10美元或更少。为了在出纳处更有效地为客户服务,需要以最少数量的硬币进行找零。
    在这个问题中,您将使用不同的硬币提供给定的找零值。编写一个程序来计算每种硬币类型所需的硬币数量。
    输入包括值v,硬币组n的大小以及每个硬币的面值f1,f2,...,fn。输出是数字列表,即c1,...,cn,表示每种硬币类型所需的硬币数量。更改可能有很多方法。 v值是一个满足0 <v≤2000的整数,表示所需的更改
    分。硬币的面值小于或等于10000。程序的输出应采用所需硬币数量最少的组合。
    例如,由香港金融管理局发行的香港硬币包括10美分,20美分,50美分,1美元,2美元,5美元和10美元,在输入中表示为n = 7,f1 = 10 ,f2 = 20,f3 = 50,f4 = 100,f5 = 200,f6 = 500,f7 = 1000。
    输入
    测试数据可能包含许多测试用例,请处理到文件末尾。
    每个测试用例的一行中都包含整数v,n,f1,...,fn。保证n≤10且0 <f1 <f2 <... <fn。
    输出
    输出是一行中的n个数字,以空格分隔。如果没有可能的更改,则您的输出应为单个-1。如果可能的解决方案不止一种,则您的程序应输出使用更多面值较低的硬币的解决方案。
    样例输入
    2000 7 10 20 50100200500 1000
    250 4 10 20 125150
    35 4 10 20 125 150
    48 4 1 8 16 20
    40 4 1 10 13 37
    43 5 1 2 21 40 80
    样例输出复制
    0 0 0 0 0 0 2
    0 0 2 0
    -1
    0 1 0 2
    3 0 0 1
    1 1 0 1 0

    #pragma GCC optimize(1)
    #pragma GCC optimize(2)
    #pragma GCC optimize(3,"Ofast","inline")
    #include<cstring>
    #include<cstdio>
    #include<iostream>
    #include<queue> 
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    template <typename Tp>
    void read(Tp &x){//read(n);
        x=0;char ch=1;int fh;
        while(ch!='-'&&(ch>'9'||ch<'0')){
            ch=getchar();
        }
        if(ch=='-'){
            fh=-1;ch=getchar();
        }else fh=1;
        while(ch>='0'&&ch<='9'){
            x=(x<<1)+(x<<3)+ch-'0';ch=getchar();
        }
        x*=fh;
    }
    inline char read1()//字符串读入挂
    {
        register char ch=getchar();
        while(ch<'A'||ch>'M')ch=getchar();
        return ch; 
    }
    const int maxn=1e6+100;
    const int mod=1000000007;
    const int INF=0x3f3f3f; 
    int a[maxn];
    int dp[maxn];
    int vis[maxn];
    int main(){
        int m,n;
        while(cin>>m>>n){
            memset(dp,0x3f3f,sizeof(dp));
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++){
                cin>>a[i];
            }
            dp[0]=0;
            for(int i=1;i<=n;i++){
                for(int j=a[i];j<=m;j++){
                    dp[j]=min(dp[j],dp[j-a[i]]+1);
                }
            }
            if(dp[m]==0x3f3f3f3f){
                printf("-1
    ");
                continue;
            }
            int z=m;
            int p=0;
            for(int i=n;i>=1;i--){
                p=0; 
                while(z-a[i]>=0&&dp[z]==dp[z-a[i]]+1){
                    vis[i]++;
                    z-=a[i];        
                } 
            }
            for(int i=1;i<=n;i++){
                cout<<vis[i]<<" ";
            }
            cout<<endl;
        }
        
    } 
  • 相关阅读:
    ng-深度学习-课程笔记-1: 介绍深度学习(Week1)
    java发送http请求和多线程
    Spring Cloud Eureka注册中心(快速搭建)
    Spring boot集成Swagger2,并配置多个扫描路径,添加swagger-ui-layer
    springboot在idea的RunDashboard如何显示出来
    Oracle 中select XX_id_seq.nextval from dual 什么意思呢?
    mysql类似to_char()to_date()函数mysql日期和字符相互转换方法date_f
    MySQL的Limit详解
    HikariCP 个人实例
    NBA-2018骑士季后赛
  • 原文地址:https://www.cnblogs.com/lipu123/p/13768275.html
Copyright © 2020-2023  润新知