现在的位置: 首页 > 综合 > 正文

poj 1293 Duty Free Shop

2014年09月05日 ⁄ 综合 ⁄ 共 830字 ⁄ 字号 评论关闭

真可谓是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;
}

抱歉!评论已关闭.