DAG Dynamic Programming - Coin Problem

#include <bits/stdc++.h>

using namespace std;
int n, m, t;
const int INF = 0x3f3f3f3f;
int a[1005],Max[1005],Min[1005];
void dfs(int *d, int s)
{
    for(int i=1; i<=n; i++)
    if(s>=a[i] && d[s] == d[s-a[i]]+1){
        printf("%d ",i);
        dfs(d,s-a[i]);
        break;
    }
}

int main()
{
    cin >> n >> m;
    for(int i=1;i<=n; i++) cin>>a[i];
    for(int i=1;i<=m;i++){
        Min[i]=INF;
        Max[i]=-INF;
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(i >= a[j]){
                Max[i] = max(Max[i-a[j]]+1,Max[i]);
                Min[i] = min(Min[i-a[j]]+1,Min[i]);
            }
        }
    }
    cout << Max[m] <<' '<< Min[m] << endl;
    dfs(Max,m);
    cout<<endl;
    dfs(Min,m);
}
/*
3 8
1 2 4
*/

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325893281&siteId=291194637