这个是完完全全按照网课老师思路敲的,上面那个加了点个人的思考,虽然这思考多半没对,但还是请大佬指点一下错误在哪
当然,这里都没过,一个样例都没过
------------
```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