您的位置:首页 > 其它

URAL 1244. Gentlemen (DP)

2014-05-20 20:41 232 查看
题目链接

题意 : 给出一幅不完全的纸牌.算出哪些牌丢失了.

思路 : 算是背包一个吧。if f[j]>0 f[j+a[i]] += f[j];然后在记录一下路径。

//1244
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std ;

int a[1100000] ,b[1010000];
int dp[1010000] ;

int main()
{
int w ;
while(~scanf("%d",&w))
{
int N ;
scanf("%d",&N) ;
for(int i = 1 ; i <= N ; i++)
scanf("%d",&a[i]) ;
memset(dp,0,sizeof(dp)) ;
memset(b,0,sizeof(b)) ;
dp[0] = 1 ;
for(int i = 1 ; i <= N ; i++)
{
for(int j = w ; j >= 0 ; j--)
{
if(dp[j] > 0 && (j+a[i] <= w))
{
dp[j+a[i]] += dp[j] ;
if(b[j+a[i]] <= 0)
b[j+a[i]] = i;
}
}
}
if(dp[w] == 0)
printf("0\n") ;
else if(dp[w] > 1)
printf("-1\n") ;
else
{
int c[110000] ;
memset(c,0,sizeof(c)) ;
for(int i = N ; i >= 1 ; i--)
{
if(b[w] == i)
{
c[i] = true ;
w -= a[i] ;
}
}
for(int i = 1 ; i <= N; i++)
if(c[i] == 0)
printf("%d ",i) ;
printf("\n") ;
}
}
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: