1021 钢条切割

#include<iostream>
#include<climits>
using namespace std;

// 无限背包问题,钢材相当于背包,每个售卖的小段钢材相当于物品,假设每种售卖的小段钢材是没有数量限制的
// dp数组申请为1维数组,2维数组显示内存不足错误
int cut_rod(int prices[], int sizes[], int capacity, int n)
{
    // 局部变量赋值为0,否则系统赋随机值
    int dp[capacity+1] = {0,};
    // 背包容量为0
    dp[0] = 0;
    // 从小到大遍历所有背包容量
    for(int i=1;i<=capacity;i++)
    {
        // 遍历所有物品
        for(int j=0;j<n;j++)
        {
            // 容量允许的情况下
            if(sizes[j]<=i)
            {
                dp[i] = max(dp[i], dp[i-sizes[j]] + prices[j]);
            }
        }
    }
    return dp[capacity];
}

int main() {
    // 测试次数
    int n_test;
    cin>>n_test;
    for(int i=0;i<n_test;i++)
    {
        // 钢条长度
        int capacity;
        cin>>capacity;
        // 价目表价格种类数
        int n_types;
        cin>>n_types;
        int prices[n_types];
        int sizes[n_types];
        for(int j=0;j<n_types;j++)
        {
            cin>>sizes[j];
            cin>>prices[j];
        }
        cout<<cut_rod(prices, sizes, capacity, n_types)<<endl;
    }
   return 0;
}