#include <stdio.h> #include <string.h> #define max(x,y) (x>y)?x:y int main () { int T,N,a,b; scanf("%d %d",&T,&N); int i,j; int dp[N+1][T+1]; memset(dp,0,sizeof(dp)); for(i=1;i<=N;i++) { char c; scanf("%s",&c); scanf("%d %d",&a,&b); for(j=1;j<=T;j++) { if(j>=a) dp[i][j]=max(dp[i-1][j],dp[i-1][j-a]+b); else dp[i][j]=dp[i-1][j]; } } printf("%d",dp[N][T]); return 0; }
时间: 2024-04-26 18:23:44 浏览: 50
#include <stdio.h>
4星 · 用户满意度95%
这段代码实现了一个背包问题,即在给定的一些物品中选取若干个放入背包,使得背包能够承受的重量最大,并且所选物品的价值之和最大。该问题可以使用动态规划来解决,具体思路是定义一个二维数组 dp[i][j],表示在前 i 个物品中选取不超过 j 重量的物品的最大价值。则 dp[i][j] 可以通过以下两种转移方程得到:
1. 如果第 i 个物品不放进背包,则 dp[i][j] = dp[i-1][j];
2. 如果第 i 个物品放进背包,则 dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i]]+b[i])。
其中 a[i] 表示第 i 个物品的重量,b[i] 表示第 i 个物品的价值。
该代码中,变量 T 表示背包的最大承重量,变量 N 表示物品的个数。在输入阶段,依次输入每个物品的重量和价值。在动态规划阶段,使用一个二维数组 dp 来记录状态,然后通过上述两个转移方程来更新 dp 数组。最终,dp[N][T] 就是背包能够承受的最大重量下所能获取的最大价值。
阅读全文