码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-11-11 16:49:03      阅读:25      评论:0      收藏:0      [点我收藏+]

标签:fast   lin   测试数据   template   cstring   stream   pac   temp   金融   

在一个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\n");
            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;
    }
    
} 

 

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

标签:fast   lin   测试数据   template   cstring   stream   pac   temp   金融   

原文地址:https://www.cnblogs.com/lipu123/p/13768275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!