01背包的变形。
代码:
#include<iostream>
#include<fstream>
using namespace std;
int dp[20000001];
int n,h;
int a[21];
void read(){
// ifstream cin("in.txt");
int i,j,k=0;
cin>>n>>h;
for(i=1;i<=n;i++)
{
cin>>a[i];
k+=a[i];
}
for(j=1;j<=a[1];j++)
dp[j]=a[1];
for(j=a[1]+1;j<=h;j++)
dp[j]=k;
for(i=2;i<=n;i++)
{
for(j=h;j>a[i];j--)
{
dp[j]=min(dp[j],dp[j-a[i]]+a[i]);
}
for(j=a[i];j>0;j--)
dp[j]=min(dp[j],a[i]);
}
cout<<dp[h]-h<<endl;
}
int main(){
read();
return 0;
}