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

匿名 (未验证) 提交于 2019-12-02 22:56:40

【题目链接】

    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\n",dp[n][m],m-minm); 18     return 0; 19 }

 

原文:https://www.cnblogs.com/Willendless/p/9379710.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!