为啥只有40分呀

P1048 [NOIP2005 普及组] 采药

``` #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int>PII; typedef unsigned long long ULL; typedef pair<long long,int> PLI; const int N = 110; int t,m; int f[N][1010],a[N],b[N]; int main() { ios::sync_with_stdio(false); cin>>t>>m; for(int i=1;i<=m;i++){ cin>>a[i]>>b[i]; } for(int i=1;i<=m;i++){ for(int j=t;j>=0;j--){ if(j>=a[i]){ f[i][j]=max(f[i-1][j],f[i-1][j-a[i]]+b[i]); } else f[i][j]=f[i-1][j]; } } cout<<f[m][t]; return 0; } ``` 为啥这样就对了,这不是和上面的一样吗。
by aaaaaagf @ 2023-08-06 15:29:09


因为第一个到了a[i]之后f[i][j]就不赋值了呀qwq
by chengyilin @ 2023-08-08 10:52:25


@[chengyilin](/user/1045924) 可是第二个到了j小于a[i]的话是f[i][j]=f[i-1][j],表示不选这个物品,那么后面的不是直接等于这个了吗。这样就和第一个没区别呀
by aaaaaagf @ 2023-08-08 15:36:33


@[aaaaaagf](/user/897276) 第一个到了$a_i$之后,f[i][j]没有=f[i-1][j],而第二个等于了
by S_Z_Xcoco @ 2023-08-09 10:55:26


@[aaaaaagf](/user/897276) 直接送你代码 ``` #include<bits/stdc++.h> using namespace std; int f[1005] , c[1005] , w[1005] , n , v ; int main() { cin >> v >> n ; for(int i = 1 ; i <= n ; i ++ ){ cin >> c[i] >> w[i] ; } for(int i = 1 ; i <= n ; i ++ ){ for(int j = v ; j >= 1 ; j -- ){ if(j >= c[i]){ f[j]=max(f[j],f[j-c[i]]+w[i]); } } } cout << f[v] ; return 0; }
by mzh98K @ 2023-08-20 09:45:28


~~楼主马蜂有些奇特~~
by zhz2013 @ 2023-08-27 21:54:47


感谢,此贴结。
by aaaaaagf @ 2023-08-31 16:17:22


|