c++的背包问题的变形

img


我没用背包的写法,我是想把每个宝石价格从大到小排列然后,用每个食物减去这个宝石价格能最后能0的就输出,排查过程就是先for一次,(食物比宝石价格高的才减)从第一个开始减减去第一个,然后减第二个依次往下到所有宝石结束。如果第一轮不行,然后就从第二个开始开始减,同理然后减第三个依次往下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);

for(int i=1;i<=t;i++)
{
    int m[1000];
    int s[1000];
    
    int a,b;
    scanf("%d",&a);
    scanf("%d",&b);
    //马丁 
    for(int q=1;q<=a;q++)
    {
        
        int c;
        scanf("%d",&c);
        m[q]=c;
        
    }
    //食物价格 
    for(int w=1;w<=b;w++)
    {
      
      int d;
      scanf("%d",&d);
      s[w]=d;
          
    }
    
    
    sort(m+1,m+a+1);
    reverse(m+1,m+a+1);

    
    for(int e=1;e<=b;e++)
    {
        int flag=0;
        int jk=s[e];
        
        for(int f=1;f<=a;f++)
        {   
             s[e]=jk;
             
               if(s[e]>=m[f])
            { 
              
             s[e]=s[e]-m[f];
            //printf("%d\n",s[e]);
            if(s[e]==0){flag=1;break;}
            
            }  
             
             
             for(int g=f+1;g<=a;g++)
             {
                
                if(s[e]>m[g]){s[e]=s[e]-m[g];}
                else if(s[e]==m[g]){s[e]=s[e]-m[g];}
                 //printf("%d\n",s[e]);
                if(s[e]==0){flag=1;break;}
                
             }
            
            if(s[e]==0){break;}
             
          }
    
        if(flag==1){printf("yes\n");}
        else{printf("no\n");} 

    }
}

}
现在自己测了很多数据都对但是wa,我想知道问题出现在哪

这就是钱币和邮票的问题嘛
面值10,5,2,1几种钱币,你要用来买东西,那就要遍历然后去匹配啊,不能用贪婪算法的
一个价值11块的东西就是要10+1,你用10+5无论如何凑不出11来

baidu动态规划背包