您的位置:首页 > 其它

USACO 5.3 Milk Measuring(迭代深搜+DP)

2013-05-24 09:37 309 查看
像是背包的逆问题,给一个体积,然后给一些物品,求用最少的物品组成这个体积,输出字典序最小的集合。

物品和体积都不小,完全没什么思路,印象中DD大神的背包9讲里,有USACO里背包问题的解析,然后发现暴力然后DP就可以过,然后。。。就水过了。。

/*
ID: cuizhe
LANG: C++
TASK: milk4
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int v;
int p[101];
int o[101];
int que[101];
int dp[20001];
int t,n;
int dfs(int x)
{
int i,j;
if(x == 0)
{
for(i = 1;i <= v;i ++)
dp[i] = 0;
for(i = 1;i <= t;i ++)
{
for(j = p[que[i]];j <= v;j ++)
dp[j] = max(dp[j],dp[j-p[que[i]]]+p[que[i]]);
}
if(dp[v] == v)
return 1;
else
return 0;
}
for(i = 1;i <= n;i ++)
{
if(!o[i])
{
o[i] = 1;
que[x] = i;
if(dfs(x-1))
return 1;
o[i] = 0;
}
}
return 0;
}
int main()
{
int i,j;
freopen("milk4.in","r",stdin);
freopen("milk4.out","w",stdout);
scanf("%d%d",&v,&n);
for(i = 1;i <= n;i ++)
scanf("%d",&p[i]);
sort(p+1,p+n+1);
for(i = 1;i <= n-1;i ++)
{
memset(o,0,sizeof(o));
t = i;
if(dfs(i))
break;
}
printf("%d",i);
if(i == n)
{
for(i = 1;i <= n;i ++)
printf(" %d",p[i]);
}
else
{
for(j = i;j >= 1;j --)
printf(" %d",p[que[j]]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: