#include <iostream>
using namespace std;
///以下是未剪枝的dfs超时代码
/*
bool visit[35]={false};
int a[35];
int minn=20000;
int n;
void dfs(int w)
{
if(w<0) return;
if(minn>w) minn=w;
if(minn==0) return;
for(int i=0;i<n;i++)
{
if(visit[i]==false)
{
visit[i]=true;
dfs(w-a[i]);
visit[i]=false;
}
}
}
int main()
{
int w;cin>>w;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
dfs(w);
cout<<minn;
return 0;
}
*/
int v[20005];
int w[35];
int main()
{
int n;
int value;
cin>>value>>n;
for(int i=0;i<n;i++)
{
cin>>w[i];
}
for(int i=0;i<=value;i++)v[i]=value;///将所有的情况初始化为最少剩下value的空间
for(int i=0;i<n;i++)
{
for(int j=value;j>=w[i];j--)
{
v[j]=min(v[j-w[i]]-w[i],v[j]);///当储存空间为j时最少剩下v[j]的空间
}
}
cout<<v[value];///输出储存空间为value时的值
}
洛谷 P1049装箱问题(dp)
最新推荐文章于 2022-02-01 14:23:47 发布