#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;
}