01背包求解

P1049 [NOIP2001 普及组] 装箱问题

数组小了吧。
by Zerosking @ 2018-10-31 16:53:57


v最大可以到20000但是你的maxn只有1000
by Zerosking @ 2018-10-31 16:54:36


而且你这个1e3的定义会导致n=1000时越界
by Dog_Two @ 2018-10-31 17:07:34


```cpp #include<bits/stdc++.h> #define ll long long #define MOD 1000000007 using namespace std; ll a[35],b[20055]; int main() { ll v,n; scanf("%lld%lld",&v,&n); for (ll i=1;i<=n;i++) { scanf("%lld",&a[i]); } b[v]=1; for (ll i=1;i<=n;i++) { for (ll j=1;j<=20000;j++) { if(b[j]==1) { if(j-a[i]>=0) b[j-a[i]]=1; } } } for (ll j=0;j<=200000;j++) { if(b[j]==1) { printf("%lld",j); return 0; } } return 0; } ```
by lhjy666 @ 2018-10-31 17:09:22


@[Zerosking](/space/show?uid=112559) **改了一下数据大小,又AC了一个(还是才60分)** ```cpp #include <iostream> #include <algorithm> using namespace std; const int maxn=2e5+1; int v[maxn],box,num,f[101][maxn]={0}; int main() { cin>>box>>num; for(int i=1;i<=num;i++) { cin>>v[i]; } for(int i=1;i<=num;i++) { for(int j=box;j>=v[i];j--) { if(v[i]<=box) { f[i][j]=max(f[i-1][j-v[i]]+v[i],f[i-1][j]); } else { f[i][j]=f[i-1][j]; } } } cout<<box-f[num][box]; return 0; } ```
by stycycle @ 2018-10-31 17:15:06


@[星空_](/space/show?uid=88718) 好奇为什么要设二维背包。。
by Immortal_Bird @ 2019-03-03 14:38:36


@[星空_](/space/show?uid=88718) 砍掉一维,就是把f[i][j]的[i]去掉,不影响结果
by Immortal_Bird @ 2019-03-03 14:49:33


|