稻花香里说丰年,听取Wa声一片!

P1048 [NOIP2005 普及组] 采药

这一题是01背包的题,不能用贪心~~不然会~~$\color{red}WA$
by wuenzi @ 2024-07-11 12:45:35


```cpp #include <bits/stdc++.h> using namespace std; int dp[2500]; int main() { int m, n; cin >> m >> n; int w[105], c[135]; for (int i = 0; i < n; i++) { cin >> w[i] >> c[i]; } for (int i = 0; i < n; i++) { for (int j = m; j >= w[i]; j--) { dp[j] = max(dp[j], dp[j - w[i]] + c[i]); } } cout << dp[m]; return 0; } ```
by wuenzi @ 2024-07-11 12:46:39


@[DreamFlyboat](/user/924336) 这个题正解是 $dp$ 用贪心会出 $bug$。 状态转移方程: ```cpp dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+s[i]); ``` 最后求 ```tms[m][t]``` 的值即可。
by duminghao123 @ 2024-07-11 13:56:48


```python #include <bits/stdc++.h> using namespace std; int w[105], val[105]; int dp[1005]; int t,m,res=-1; int main() { cin>>t>>m; for(int i=1;i<=m;i++) { cin>>w[i]>>val[i]; } for(int i=1;i<=m;i++) { for(int j=t;j>=0;j--) { if(j>=w[i]) { dp[j]=max(dp[j-w[i]]+val[i], dp[j]); } } } cout<<dp[t]; return 0; } ``` 这样子就可以
by York1121 @ 2024-07-14 11:13:37


也可以逆推,用一维数组,空间复杂度只有O(n) ```cpp #include<bits/stdc++.h> using namespace std; int t,n,w[1020],v[1020],f[1020]; int main(){ cin>>t>>n; for(int i=1;i<=n;i++){ cin>>w[i]>>v[i]; } for(int i=1;i<=n;i++){ for(int j=t;j>=w[i];j--){ f[j]=max(f[j],f[j-w[i]]+v[i]); } } cout<<f[t]; return 0; } ```
by 230327liuyanzhe @ 2024-07-20 10:32:47


|