1. 程式人生 > >FZU-2214 Knapsack problem

FZU-2214 Knapsack problem

ins des mit 最大 AS discus ase tro source

Problem 2214 Knapsack problem

Accept: 863 Submit: 3347
Time Limit: 3000 mSec Memory Limit : 32768 KB

技術分享圖片 Problem Description

Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the items into a knapsack so that the total weight is less than or equal to a given limit B and the total value is as large as possible. Find the maximum total value. (Note that each item can be only chosen once).

技術分享圖片 Input

The first line contains the integer T indicating to the number of test cases.

For each test case, the first line contains the integers n and B.

Following n lines provide the information of each item.

The i-th line contains the weight w[i] and the value v[i] of the i-th item respectively.

1 <= number of test cases <= 100

1 <= n <= 500

1 <= B, w[i] <= 1000000000

1 <= v[1]+v[2]+...+v[n] <= 5000

All the inputs are integers.

技術分享圖片 Output

For each test case, output the maximum value.

技術分享圖片 Sample Input

1 5 15 12 4 2 2 1 1 4 10 1 2

技術分享圖片 Sample Output

15

技術分享圖片 Source

第六屆福建省大學生程序設計競賽-重現賽(感謝承辦方華僑大學)

Submit Back Status Discuss 原題地址
#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int w[505];
int v[505];
long long dp[5005];
int n,m;

int main(){
        int t;
        std::ios::sync_with_stdio(false);
        cin>>t;
        while(t--){
                cin>>n>>m;
                int sum=0;
                for(int i=0;i<n;i++){
                        cin>>w[i]>>v[i];
                        sum+=w[i];
                }
                memset(dp,INF,sizeof(dp));
                dp[0]=0;
                for(int i=0;i<n;i++){
                        for(int j=5000;j>=0;j--){///價值
                                if(j>=v[i]){
                                        dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
                                        dp[j]=dp[j]==0?(dp[j-v[i]]+w[i]):min(dp[j],dp[j-v[i]]+w[i]);
                                        ///存重量
                                }

                        }
                }
                int ans=0;
                for(int i=0;i<=5000;i++){
                      //  dp[i]=0x3f3f3f3f-dp[i];
               //         cout<<i<<" "<<dp[i]<<endl;
                        if(dp[i]<=m&&i>ans){
                                ans=i;
                        }
                }
                cout<<ans<<endl;
        }
}

  

題意:給你N個物品,每個物品都有自己的價值和需要的容量,M的容量,問你不超過M最大的價值,帶上M太大數組存不下 思路:所以換個思路,把容量換價值轉換成得到價值使得容量最小,這是數組只要5000 復雜度是O(n*5000) 代碼:

FZU-2214 Knapsack problem