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