【1】题解:P5997 [PA 2014] Pakowanie【动态规划】【状压 DP】【贪心】
感觉这题放 NOIP T1 超级合适。这是一道状压 DP 的好题。首先看数据范围
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105,M=(1<<24)+5;
int a[N],b[N],n,m;
int f[M],g[M];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
sort(b,b+m,greater<int>());
for(int i=1;i<(1<<n);i++)
f[i]=m+1;
for(int sta=0;sta<(1<<n);sta++){
for(int i=0;i<n;i++)if((sta>>i)&1){
int pre=sta^(1<<i);
if(g[pre]>=a[i]){
if(f[pre]<f[sta]||(f[pre]==f[sta]&&g[pre]-a[i]>g[sta])){
f[sta]=f[pre];
g[sta]=g[pre]-a[i];
}
}else if(b[f[pre]]>=a[i]){
if(f[pre]+1<f[sta]||(f[pre]+1==f[sta]&&b[f[pre]]-a[i]>g[sta])){
f[sta]=f[pre]+1;
g[sta]=b[f[pre]]-a[i];
}
}
}
}
if(f[(1<<n)-1]==m+1) cout<<"NIE";
else cout<<f[(1<<n)-1];
return 0;
}