题目:codevs 1014
思路:我是深搜直接求得答案。还有一种dp的方法,都挺简单的;
代码如下:
dfs:
#include<iostream>
#include<algorithm>
using namespace std;
int v,n;
int minv = 1<<30;
int a[40];
int sum;
bool cmp(int x,int y)
{
return x>y;
}
void dfs(int x,int p)
{
if(x == v){
minv = 0;
return;
}
for(int i = p+1;i < n;i++)
{
if(x+a[i] <= v)
{
minv = min(v-x-a[i],minv);
dfs(x+a[i],i);
}
}
}
int main()
{
cin >> v;
cin >> n;
for(int i = 0;i < n;i++)
{
cin >> a[i];
}
sort(a,a+n,cmp);
for(int i = 0;i < n;i++)
{
sum = a[i];
dfs(sum,i);
sum = 0;
}
cout << minv;
return 0;
}
dp:
#include<cstdio>
#include<cstring>
int v,n,c[20005],f[20005];
void init()
{
memset(f,0,sizeof(f));
scanf("%d%d",&v,&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&c[i]);
}
}
int max(int a,int b)
{ return a>b ? a:b; }
void dp()
{
for (int i=1;i<=n;++i)
for (int j=v;j>=c[i];--j)
{
f[j]=max(f[j],f[j-c[i]]+c[i]);
}
printf("%d",v-f[v]);
}
int main()
{
init();
dp();
return 0;
}