传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2073
状压DP+枚举子集
Code:
#include<bits/stdc++.h>
using namespace std;
int n,W;
int w[18],t[18];
int dp[1<<16],sum[1<<16],tim[1<<16];
int main(){
cin>>W>>n;
for(int i=1;i<=n;i++)cin>>t[i]>>w[i];
for(int i=1;i<(1<<n);i++){
for(int j=1;j<=n;j++){
if(i>>(j-1)&1){
sum[i]+=w[j];
tim[i]=max(tim[i],t[j]);
}
}
}
for(int i=1;i<(1<<n);i++){
dp[i]=2333333;
for(int j=i;j;j=i&(j-1))
if(sum[j]<=W)dp[i]=min(dp[i],tim[j]+dp[i^j]);
}cout<<dp[(1<<n)-1]<<endl;
return 0;
}