http://acm.timus.ru/problem.aspx?space=1&num=1244dp,0-1背包问题:注意题意要看懂,话说我wa了不知道多少次,看了题解才知道原来是要求剩余重量的背包问题!!!记录路径的dp:
#include<stdio.h>
#include<string.h>
#include<math.h>
int tot,n,a[105],g[100005],p[1000005],q[105];
int main()
{
int i,j,flag,sum;
while (scanf("%d%d",&tot,&n)==2)
{
memset(g,0,sizeof(g));
memset(p,0,sizeof(p));
sum=0;
for (i=1; i<=n ; i++ )
{
scanf("%d",&a[i]);
sum+=a[i];
}
tot=sum-tot;
if (tot<0)
{
printf("0\n");
continue;
}
g[0]=1;
for (i=1; i<=n; i++)
{
for (j=tot-a[i]; j>=0; j--)
if (g[j])
{
if (!g[j+a[i]])
p[j+a[i]]=i;
g[j+a[i]]+=g[j];
}
}
if (g[tot]==0)
printf("0\n");
else if (g[tot]>1)
printf("-1\n");
else
{
j=0;
for (i=n; i>=1 ; i-- )
if (p[tot]==i)
{
q[++j]=i;
tot=tot-a[i];
}
for (i=j; i>1 ; i-- )
printf("%d ",q[i]);
printf("%d\n",q[1]);
}
}
return 0;
}
这些个经验还是要好好积累啊!!!题意看懂有点难,