poj 1293 Duty Free Shop

来源:互联网 发布:你知我所想我知你所要 编辑:程序博客网 时间:2024/06/06 12:22

真可谓是wrong了一地, 如果有和我一样的,我可以提供点参考点。

我错的地方是, 没考虑到m可以一个都不放进盒子里   

比如这组数据

1 10

5

2 2 2 2 2

这时m一个也不需要,所有的盒子全部用来放l, 所以此时的输出时0, 哎,伤心啊。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int Maxn = 2010;int m, l, n, sum, ans;int v[Maxn];bool dp[Maxn];int path[Maxn];void fint(int x) {    ans += 1;    if(x - v[path[x]] == 0)    {        cout<<ans<<" "<<path[x];        return;    }    else    {        fint(x - v[path[x]]);        cout<<" "<<path[x];    }}void solve() {    ans = 0;    memset(path, 0, sizeof(path));    memset(dp, false, sizeof(dp));    int ma = 0;    dp[0] = true;    for(int i = 1; i <= n; ++i)    {      ma += v[i];      if(ma > m)        ma = m;    for(int j = ma; j >= v[i]; j--)    {        if(dp[j - v[i]]&&!dp[j])            {                dp[j] = true;                path[j] = i;            }    }    }    int k = m;    while(!dp[k])        k--;    if((sum - k) > l)    cout<<"Impossible to distribute"<<endl;    else    {        if(k == 0)            cout<<0;        else        fint(k);        cout<<endl;    }}int main(void){    while(scanf("%d%d",&m,&l), m||l) {        sum = 0;        scanf("%d",&n);        for(int i = 1; i <= n; ++i)        {            scanf("%d",v+i);            sum += v[i];        }        solve();    }    return 0;}


0 0
原创粉丝点击