UVa 624
地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565
题意:背包问题,最多装多少。
mark:本题要求输出装的每一个价值,需要回溯一下,必须用二维的。
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <algorithm> #include <map> #define LL long long using namespace std; const int N = 10010; int n,vv; int v[30]; int dp[30][N]; int max(int a, int b) {return a > b ? a : b;} void zero_dp(int i) { for(int j = vv; j >= 0; j--) { dp[i][j] = dp[i-1][j]; if(j >= v[i]) dp[i][j] = max(dp[i][j], dp[i-1][j-v[i]]+v[i]); } } void print(int i, int j) { if(!i) return ; if(dp[i][j] == dp[i-1][j]) print(i-1, j); else { print(i-1, j-v[i]); printf("%d ", v[i]); } } int main() { int i; while(~scanf("%d%d", &vv, &n)) { for(i = 1; i <= n; i++) scanf("%d", v+i); memset(dp, 0, sizeof(dp)); for(i = 1; i <= n; i++) zero_dp(i); print(n, vv); printf("sum:%d\n", dp[n][vv]); } return 0; }