很奇怪的一道题,这样做居然要过不去 居然不压成一维就对了,其他情况就错了

#include<bits/stdc++.h>
using  namespace  std;
const  int  N=20000;
int  a[N];
int  dp[N];
int  main()
{
    int  v,n;
    cin>>v>>n;
    for(int  i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int  i=1;i<=n;i++)
    {
        for(int j=v;j>=a[i];j--)
        {
           dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
        }
    }
        cout<<v-dp[v];
}

这里要写第二道题

#include<bits/stdc++.h>   
using namespace std; 
  
const int N = 20010; 
int a[N]; // 存储物品体积的数组  
int dp[N][N]; // 动态规划数组,dp[i][j]表示前i个物品放入容量为j的箱子时的最大体积  
  
int main()  
{  
    int n, v; // n表示物品数量,v表示箱子容量  
    cin >> v >> n; // 输入箱子容量和物品数量  
  
    for(int i = 0; i < n; i++) // 遍历所有物品  
    {  
        cin >> a[i]; // 输入第i个物品的体积  
    }  
  
    // 初始化dp数组,所有dp[0][j]都为0,表示没有物品时箱子内的体积为0  
//     for(int j = 0; j <= v; j++)  
//     {  
//         dp[0][j] = 0;  
//     }  
  
    // 动态规划填充dp数组  
    for(int i = 1; i <= n; i++) // 遍历所有物品  
    {  
        for(int j = 0; j <= v; j++) // 遍历所有可能的箱子容量  
        {  
            // 如果当前箱子容量j小于第i个物品的体积a[i-1],则不能放入该物品,直接继承前一个物品时的最大体积  
            if(j < a[i-1])  
            {  
                dp[i][j] = dp[i-1][j];  
            }  
            // 否则,可以选择放入或不放入第i个物品,取两种情况中的较大值  
            else  
            {  
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i-1]] + a[i-1]);  
            }  
        }  
    }  
    cout << v - dp[n][v] << endl;  
    return 0; 
}这里值得注意的就是下标问题,下标问题必须要仔细思考