hdu(2260) Accepted Necklace

来源:互联网 发布:剑灵夕颜捏脸数据 编辑:程序博客网 时间:2024/05/23 14:33

//这个做着很顺,一下就对了,难道找到感觉了;

//用回朔法,把所有值遍历一遍,取其中最大值即可;

 

#include"stdio.h"
#include"string.h"
int k,h,a[30],b[30];
int visit[30],max,m;
void bfs(int n,int v,int w,int l)
{
 int i;
 if(n==k&&v<=h)
 {
  if(max<w)
   max=w;
 }
 for(i=l;i<=m;i++)
 {
  if(visit[i]==0&&v+b[i]<=h)
  {
   visit[i]=1;
   bfs(n+1,v+b[i],w+a[i],i+1);
   visit[i]=0;
  }
 }
}
int main()
{
 int i,p;
 scanf("%d",&p);
 while(p--)
 {
  scanf("%d%d",&m,&k);
  memset(visit,0,sizeof(visit));
  for(i=1;i<=m;i++)
   scanf("%d%d",&a[i],&b[i]);
  scanf("%d",&h);
  max=0;
  bfs(0,0,0,0);
  printf("%d\n",max);
 }
 return 0;
}

 

 

dp的做法;

#include<stdio.h>
#include<string.h>
int dp[1005][25];
int a[100],b[100];
int max(int a,int b)
{
 return a>b?a:b;
}
int main()
{
 int t,m,n,k,i,j,h;
 scanf("%d",&t);
 while(t--)
 {
  
  scanf("%d%d",&n,&k);
  for(i=0;i<n;i++)
   scanf("%d%d",&a[i],&b[i]);
  scanf("%d",&m);
  memset(dp,0,sizeof(dp));
  for(i=0;i<n;i++)
  {
   for(j=m;j>=b[i];j--)
    {
     for(h=k;h>0;h--)
     {
      dp[j][h]=max(dp[j][h],dp[j-b[i]][h-1]+a[i]);
     }
    }
  }
  printf("%d\n",dp[m][k]);
 }
 return 0;
}