【题目链接】
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 }