宠物小精灵之收服 (二维01背包)

【题目链接】

    http://noi.openjudge.cn/ch0206/4978/

【算法】

    做的第一道二维的背包问题,只需开的数组增加一维以正确表述每一个状态即可。本质还是多过程决策+最优子结构+无后效性。

【代码】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k,i,j,t,minm;
 4 int v[1010],u[510],dp[1010][510];
 5 int main()
 6 {
 7     scanf("%d%d%d",&n,&m,&k);
 8     minm=m;
 9     for(i=1;i<=k;i++) scanf("%d%d",&v[i],&u[i]);
10     for(i=1;i<=k;i++)
11         for(j=n;j>=v[i];j--)
12             for(t=m;t>=u[i];t--)
13                 dp[j][t]=max(dp[j][t],dp[j-v[i]][t-u[i]]+1);
14     for(i=0;i<=n;i++)
15         for(j=0;j<=m;j++)
16             if(dp[i][j]==dp[n][m]&&j<minm) minm=j;
17     printf("%d %d
",dp[n][m],m-minm);
18     return 0;
19 }
原文地址:https://www.cnblogs.com/Willendless/p/9379710.html