1068. Find More Coins

01背包,最小字典序结果,恰好填满,照顾好这三点就行了,背包九讲里有说的

#include<algorithm>
#include<iostream>
using namespace std;
const int N=10003,V=103;
int n,m,pack[V],used[N][V],wei[N];
int main(){
  fill_n(pack+1,V-1,-1<<30);
  cin>>n>>m;
  for(int i=0;i<n;++i) cin>>wei[i];
  sort(wei,wei+n,greater<int>());
  for(int i=0;i<n;++i)
    for(int j=m;j>=wei[i];--j)
      if(pack[j-wei[i]]+wei[i]>=pack[j]){
	used[i][j]=true;
	pack[j]=pack[j-wei[i]]+wei[i];
      }
  if(pack[m]!=m) cout<<"No Solution";
  else{
    int weight=m,flag=0;
    for(int i=n-1;i>=0;--i)
      if(used[i][weight]){
	cout<<(flag++?" ":"")<<wei[i];
	weight-=wei[i];}
  }
}
给定若干个数字,求其中某些数字之和等于一个给定值,妥妥的NP问题,真是很难想到用背包来解决,而且我感觉这种问题在生活中应该是很常见很实际的问题


你可能感兴趣的:(1068. Find More Coins)