设为首页 加入收藏

TOP

01背包变形 HDU 2660
2015-07-20 17:34:58 来源: 作者: 【 】 浏览:2
Tags:背包 变形 HDU 2660

题目跟一般的01背包相比就是多了个条件。要求最多只能选择k个,所以只要对着k个进行一次循环就可以了。

Accepted Necklace

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2701 Accepted Submission(s): 1067


Problem Description I have N precious stones, and plan to use K of them to make a necklace for my mother, but she won't accept a necklace which is too heavy. Given the value and the weight of each precious stone, please help me find out the most valuable necklace my mother will accept.

Input The first line of input is the number of cases.
For each case, the first line contains two integers N (N <= 20), the total number of stones, and K (K <= N), the exact number of stones to make a necklace.
Then N lines follow, each containing two integers: a (a<=1000), representing the value of each precious stone, and b (b<=1000), its weight.
The last line of each case contains an integer W, the maximum weight my mother will accept, W <= 1000.

Output For each case, output the highest possible value of the necklace.
Sample Input
1 
2 1 
1 1 
1 1 
3 

Sample Output
1 

Source HDU男生专场公开赛――赶在女生之前先过节(From WHU)
Recommend zty | We have carefully selected several similar problems for you: 1258 2553 1045 2181 2952
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                  using namespace std; #define MAXN 22 struct node{ int val; int w; }a[MAXN]; int dp[1010][22]; int max1(int a,int b){ return a>b?a:b; } int main(){ int T; int n,k,W; int i; while(~scanf("%d",&T)){ while(T--){ scanf("%d%d",&n,&k); memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); for(i=1;i<=n;i++){ scanf("%d%d",&a[i].val,&a[i].w); } scanf("%d",&W); int j,v; for(i=1;i<=n;i++){ for(v=W;v>=a[i].w;v--){ for(j=1;j<=k;j++){ dp[v][j] = max1(dp[v][j],dp[v-a[i].w][j-1]+a[i].val); } } } printf("%d\n",dp[W][k]); } } return 0; } 
                
               
              
             
            
           
          
         
        
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇leetcode - Longest Consecutive .. 下一篇UVA 11354 - Bond(树链剖分)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)