Uva624 01背包输出方案 xingxing在努力
题目是给你一个长度为N的磁带, 让你将t首歌放入磁带中, 输出歌曲总长度不超过N的情况下的方案。
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int c[30]; int f[10000 + 100]; int vis[30][10000 + 10]; int n, m; int main() { while(scanf("%d%d", &n, &m) == 2) { for(int i=1; i<=m; i++) scanf("%d", &c[i]); memset(f, 0, sizeof(f)); memset(vis, 0, sizeof(vis)); for(int i=m; i>=1; i--) { for(int j=n; j>=c[i]; j--) { if(f[j] < f[j-c[i]]+c[i]) { f[j] = f[j-c[i]] + c[i]; vis[i][j] = 1; } } } for(int i=1, j=f[n]; i<=m; i++) if(vis[i][j]) { printf("%d ", c[i]); //printf("%d %d\n", i, j); j -= c[i]; } printf("sum:%d\n", f[n]); } return 0; }