Chủ Nhật, 24 tháng 4, 2022

VANTAI C++

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int a[15];
int m, n;
int f[101][100005], vc = 1e9, tr[100005], ans[15];
ll tong = 0;



void nhap() {
	cin >> m >> n;
	for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        tong += a[i];
	}
}

void truyvet()
{
    int d[101];
    for(int i=1;i<=n;i++) d[i]=1;
    int n1=n;
    while(n>0&&m>0)
    {
       // cout<<n<<" "<<m<<endl;
        if(f[n][m]==f[n-1][m]){
            n--;
        }
        else{
            d[n]++;
            m=m-a[n];
        }
    }
  //  cout<<n<<" "<<m<<endl;
    for(int i=1;i<=n1;i++)
        cout<<d[i]<<" ";
}

void dp1()
{ //  cout<<m<<endl;
    f[0][0]=0;
    for(int j=1;j<=m;j++) f[1][j]=vc;
    for(int j=1;j<=m/a[1];j++)
        f[1][j*a[1]]=j;
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            f[i][j]=f[i-1][j];
            if(j-a[i]>=0) f[i][j]=min(f[i][j],f[i][j-a[i]]+1);
        }
    }
  /*  for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++) cout<<f[i][j]<<" ";
    cout<<endl;
}*/
    cout<<n+f[n][m]<<endl;

    truyvet();

}



void giai() {
	if(tong > m) {
		cout << 0 << endl;
		return;
	}
	if(tong == m) {
		cout << n << endl;
		for(int i=1;i<=n;i++) cout << 1 << ' ';
		return;
	}

	m =m- tong;
    dp1();

}

int main()
{
   ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    freopen("b.inp", "r", stdin);
    freopen("b.out", "w", stdout);
    nhap();
    giai();
 //  solve();
}

Không có nhận xét nào:

Đăng nhận xét

Lưu ý: Chỉ thành viên của blog này mới được đăng nhận xét.