文章
2
粉丝
104
获赞
8
访问
2.0k
#include<bits/stdc++.h> // 包含标准库,方便使用各种功能
using namespace std;
int main(){
int s, n; // 定义变量s表示背包的容量,n表示物品的数量
while(cin >> s >> n){ // 多组测试数据,循环读取输入
int a[n+1]; // 定义数组a,存储每个物品的重量,大小为n+1(方便从1开始索引)
for(int i = 1; i <= n; i++) cin >> a[i]; // 读取每个物品的重量
int dp[n+1][s+1]; // 定义动态规划数组dp,dp[i][j]表示考虑前i个物品时,是否能够凑出重量j
memset(dp, 0, sizeof(dp)); // 初始化dp数组,将所有值设为0
int flag = 0; // 标志变量,用于标记是否找到满足条件的解
for(int i = 1; i <= n; i++){ // 遍历每个物品
for(int j = s; j >= 0; j--){ // 遍历背包容量,从大到小(防止重复使用物品)
if(j - a[i] >= 0) // 如果当前背包容量j能够放下第i个物品
dp[i][j] = max(dp[i-1][j-a[i]] + a[i], dp[i-1][j]); // 选择放入或不放入,取最大值
else
dp[i][j] = dp[i-1][j]; // 如果放不下,继承之前的状态
if(dp[i][j] == s){ // 如果当前状态已经满足背包容量s
flag = 1; // 设置标志变量为1
break; // 退出内层循环
}
...
登录后发布评论
我这个别看了,思路有点问题。题目的测试用例不强我才AC的,后来发现还是有问题