怎么会是零分

P1048 [NOIP2005 普及组] 采药

你dp数组意义完全开反了了吧,第一维是第几个,最大就一百,第二维是体积,最大是一千。这种错误重新读题就读出来了的= =
by minamikotori @ 2017-03-31 22:17:16


对啊。同上--
by fy0123 @ 2017-03-31 22:27:13


你的dp是有些乱,给你个参考 ```cpp #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> using namespace std; struct tb { int x, y; }s[105]; int dp[105][1005]; int main( ) { int t, n; while(scanf("%d%d", &t, &n) != EOF) { memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; i++) scanf("%d%d", &s[i].x, &s[i].y); for(int i = n - 1; i >= 0; i--) { for(int j = 0; j <= t; j++) { if(j < s[i].x) dp[i][j] = dp[i+1][j]; else dp[i][j] = max(dp[i+1][j], dp[i+1][j-s[i].x] + s[i].y); } } printf("%d\n", dp[0][t]); } return 0; } ```
by tb2016 @ 2017-04-05 20:50:20


给你个参考,比@[tb2016](/space/show?uid=39182) 好: ```cpp #include<cstdio> using namespace std; int n,c; int w[1001],v[1001],f[1001]; int max(int x,int y) { if(x>y) return x; return y; } int main() { int i,j; scanf("%d%d",&c,&n); for(i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]); for(i=1;i<=n;i++) for(j=c;j>=w[i];j--) f[j]=max(f[j],f[j-w[i]]+v[i]); printf("%d",f[c]); return 0; } ```
by rxzfn @ 2017-04-12 20:19:39


```cpp #include <bits/stdc++.h> using namespace std; const int MAXT=1000+10; const int MAXN=100+10; struct med{ int time; int value; }a[MAXN]; int t,n; int dp[MAXN][MAXT]; int main(){ memset(dp,0,sizeof(dp)); cin>>t>>n; for(int i=1;i<=n;i++){ cin>>a[i].time>>a[i].value; } for(int i=1;i<=n;i++){ for(int j=1;j<=t;j++){ if(a[i].time<=t&&j-a[i].time>=0){ dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].time]+a[i].value); } else{ dp[i][j]=dp[i-1][j]; } } } cout<<dp[n][t]<<endl; return 0; } ```
by GHOST_RIDER @ 2017-05-13 20:07:40


|