程设模拟考 H:宠物小精灵之收服
题目见此:http://cxsjsx.openjudge.cn/2013weekend5a/H/
解题思路:
- 典型的01背包,不过是二维限制的
- 最后要把V2扫一遍找伤血最少的情况
贴代码:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int N, V, V2, dp[1000][500]={0}, c1[100], c2[100]; 6 7 int main() 8 { 9 cin >> V >> V2 >> N; 10 for(int i=1 ; i<=N ; i++) 11 cin >> c1[i] >> c2[i]; 12 dp[0][0] = 0; 13 for(int i=1 ; i<=N ; i++) 14 for(int j=V ; j>=c1[i] ; j--) 15 for(int k=V2 ; k>=c2[i] ; k--) 16 dp[j][k] = max(dp[j][k], dp[j-c1[i]][k-c2[i]]+1); 17 for(int k=0 ; k<=V2 ; k++) 18 if(dp[V][k] == dp[V][V2]) 19 { 20 cout << dp[V][k] << " " << V2-k << endl; 21 break; 22 } 23 }