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