dp好难,有没有人教教我

P1048 [NOIP2005 普及组] 采药

这个是完完全全按照网课老师思路敲的,上面那个加了点个人的思考,虽然这思考多半没对,但还是请大佬指点一下错误在哪 当然,这里都没过,一个样例都没过 ------------ ```c #include<stdio.h> int max(int a,int b) { if(a>b) return a; else return b; } int main() { int v,n; scanf("%d %d",&v,&n); int i,j; int pay[n],vis[n]; for(i=0;i<n;i++) { scanf("%d %d",&pay[i],&vis[i]); } int f[n][v]; for(j=0;j<=n;j++) { for(i=0;i<=v;i++) f[j][i]=0; } for(j=1;j<=n;j++) { for(i=0;i<=v;i++) { if(i<pay[j]) f[j][i]=f[j-1][i]; else { f[j][i]=max(f[j-1][i],f[j-1][i+pay[j]]+vis[j]); } } } printf("%d",f[n][0]); } ```
by zuilp @ 2024-02-16 01:36:52


您想一下你的f[][]代表的意思是什么
by sading @ 2024-02-16 01:49:36


我感觉写的乱乱的。
by sading @ 2024-02-16 01:51:30


还有数组最好定在main函数外不然会离奇死亡
by sading @ 2024-02-16 01:53:39


``` 还有数组最好定在main函数外不然会离奇死亡 ``` 不要
by sading @ 2024-02-16 01:58:46


@[zuilp](/user/1165831) 对于你的第一份代码,请注意你在第 25 行的循环是从 $1$ 到 $n$ 的,因此你的输入也应该从 $1$ 到 $n$,第 15 行应改为: ```cpp for (int j = 1; i <= n; ++i) ``` 同时,在上述修改以及你在第 20 行的初始化中,存在数组越界问题,应当将数组开大一些,第 14 行与第 19 行可改为: ```cpp int pay[n + 1],vis[n + 1]; int f[n + 1][v + 1]; ``` 除此之外,你的思考完全正确,请保持自信。另外,也可以将数组定义在全局,C++ 会自动为你初始化,避免了手动初始化带来的麻烦。
by RyanLi @ 2024-02-16 02:34:23


@[RyanLi](/user/716556) 你说得对,但是第15行可以改为 ` for (i = 1; i <= n; ++i) ` 应该是i不是j,int可有可无,毕竟之前已经声明过了
by 杜都督 @ 2024-02-16 02:41:39


@[杜都督](/user/39279) 打顺手了(
by RyanLi @ 2024-02-16 12:15:11


@[zuilp](/user/1165831) 对于你的第一份代码,请注意你在第 25 行的循环是从 $1$ 到 $n$ 的,因此你的输入也应该从 $1$ 到 $n$,第 15 行应改为: ```cpp for (i = 1; i <= n; i++) ``` 同时,在上述修改以及你在第 20 行的初始化中,存在数组越界问题,应当将数组开大一些,第 14 行与第 19 行可改为: ```cpp int pay[n + 1],vis[n + 1]; int f[n + 1][v + 1]; ``` 除此之外,你的思考完全正确,请保持自信。另外,也可以将数组定义在全局,C++ 会自动为你初始化,避免了手动初始化带来的麻烦。
by RyanLi @ 2024-02-16 12:16:56


|