程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 01背包變形 HDU 2660

01背包變形 HDU 2660

編輯:C++入門知識

01背包變形 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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved