DP专题

Find More Coins (30)

Link
01背包问题

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <cmath>
using namespace std;
int n,m;
int w[10001];
int dp[101];
bool path[10001][101];
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",&w[i]);
	sort(w+1,w+1+n,greater<int>());
	for(int i=1;i<=n;++i)
		for(int j=m;j>=w[i];--j)
			if(dp[j-w[i]]+w[i]>=dp[j]){
				path[i][j]=true;
				dp[j]=dp[j-w[i]]+w[i];
			}
	if(dp[m]!=m) printf("No Solution\n");
	else{
		int i=n,j=m;
		while(1){
			if(path[i][j]){
				printf("%d",w[i]);
				j-=w[i];
				if(j!=0) printf(" ");
			}
			i--;
			if(i==0||j==0) break;
		}
	}
	return 0;
}
posted @ 2022-06-23 07:41  Ryomk  阅读(9)  评论(0编辑  收藏  举报