1068 Find More Coins

#include<bits/stdc++.h> 
using namespace std;
const int MAXN=10001;
const int MAXV=200;
int weight[MAXN];
int d[MAXV]={};
bool flag[MAXN]={false};
bool choice[MAXN][MAXV];
bool cmp(int a,int b){
	return a>b;
}
int main()
{
	//freopen("in.txt","r",stdin);
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>weight[i];
	}
	sort(weight+1,weight+n+1,cmp);
	for(int i=1;i<=n;i++){
		for(int v=m;v>=weight[i];v--){
			if(d[v-weight[i]]+weight[i]>=d[v]){
				d[v]=d[v-weight[i]]+weight[i];
				choice[i][v]=1;
			}else{
				choice[i][v]=0;
			}
		}
	}
	if(d[m]!=m){ cout<<"No Solution";return 0;
	}
	int v=m;int k=n;
	while(k>=0){
		if(choice[k][v]==1){
			flag[k]=true;
			v=v-weight[k];
		}
		k--;
	}
	int sign=0;
	for(int i=n;i>=1;i--){
		if(flag[i]==true&&sign==1){
			cout<<' '<<weight[i];
		}
		if(flag[i]==true&&sign==0){
			cout<<weight[i];sign=1;
		}
	}
	
	
	return 0;
}

01背包一维数组解决

如果数据量不大的情况下其实是可以用dfs做的,试了一下,有两个测试点超时,估计是数据太大递归栈调用超额的原因,这种题目还是动态规划更靠谱一点。另一方面也说明dfs和背包其实有重叠的部分

#include<bits/stdc++.h> 
using namespace std;
int n,m;
vector<int> opt,temp;
vector<int> ppp;
bool cmp(int a,int b){
	return a>b;
}
bool judge(vector<int> a,vector<int> b){
	sort(a.begin(),a.end());
	sort(b.begin(),b.end()); 
	if(a.size()==0) return true;
	for(int i=0;i<a.size();i++){
		if(a[i]>b[i]) return true;
		else if(a[i]==b[i]){
			continue;
		}else if(a[i]<b[i]){
			return false;
		}
	}
}
void dfs(int index,int sum){
	if(sum==m){
		if(judge(opt,temp)==true){
			opt=temp;
		}
		return;
	}
	if(index==n||sum>m) return;
	temp.push_back(ppp[index]);
	dfs(index+1,sum+ppp[index]);
	temp.pop_back();
	dfs(index+1,sum);
}
int main()
{
	freopen("in.txt","r",stdin);
	cin>>n>>m;
	ppp.resize(n);
	for(int i=0;i<n;i++){
		cin>>ppp[i];
	}
	sort(ppp.begin(),ppp.end(),cmp);
	dfs(0,0);
	if(opt.size()==0){
		cout<<"No Solution";return 0;
	}
	sort(opt.begin(),opt.end());
	for(int i=0;i<opt.size();i++){
		if(i==0) cout<<opt[i];
		else cout<<' '<<opt[i];
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/csg3140100993/article/details/82253169