ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

ural-1244(背包dp)

http://acm.timus.ru/problem.aspx?space=1&num=1244

dp,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;
}

这些个经验还是要好好积累啊!!!题意看懂有点难,

posted on 2012-03-11 11:40 wangs 阅读(145) 评论(0)  编辑 收藏 引用 所属分类: ACM-201203


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理