UVA 624 - CD

来源:互联网 发布:windows怎么ping 编辑:程序博客网 时间:2024/06/03 17:07

这道背包题很基础,要学习一下dp输出,。

代码如下:

#include<stdio.h>
#include<string.h>
#define MAXN 10000
int tap, cdnum, num[25],f[25][MAXN],p[25][MAXN];
void print(int i, int j)
{
if(i == 0)
return;
print(i - 1, p[i][j]);
if(p[i][j] < j)
printf("%d ", num[i]);
}
void solve()
{
memset(p,0,sizeof(p));
memset(f,0,sizeof(f));
for(int i = 1; i <= cdnum; i ++)
for(int j = 0; j <= tap; j ++)
{
f[i][j] = f[i-1][j];
p[i][j] = j;
if(j>=num[i]&&f[i-1][j-num[i]]+num[i] > f[i][j])
{
f[i][j] = f[i-1][j-num[i]]+num[i]; p[i][j] = j-num[i];
}
}
print(cdnum,tap);
printf("sum:%d\n",f[cdnum][tap]);
}
void input()
{
while(scanf("%d%d",&tap, &cdnum) == 2)
{
for(int i = 1; i <= cdnum; i ++)
scanf("%d",&num[i]);
solve();
}
}
int main()
{
input();
return 0;
}



0 0
原创粉丝点击