【限定条件的0-1背包】

Perfect decision

TimeLimit: 2 Second MemoryLimit: 32 Megabyte

Totalsubmit: 128 Accepted: 23

Description

有N个物品(1<=N<=100),每个物品都有自己的重量Wi(1<=Wi<=10000)和价值Vi(1<=Vi<=10000)。从N个物品中选择一些,使其价值之和大于M(1<=M<S,S为所有物品价值之和),求满足条件时,重量之和的最小值。

Input

多CASE。对于每组测试:第1行,两个正整数:N,M。第2行到第N+1行,每行两个正整数Vi和Wi。

Output

一个正整数,表示重量之和的最小值。

Sample Input

5 16
3 3
1 1
3 4
5 5
6 6

Sample Output

18

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<time.h>
using namespace std;
int n,m;
int w[100];
int v[100];
int f[1000002];
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(f,0,sizeof(f));
        int sum=0;
        int val=0;
        for(int i=0;i<n;i++)
        {
             scanf("%d%d",&w[i],&v[i]);
             sum+=w[i];
             val+=v[i];
        }
        sum-=m;
        for(int i=0;i<n;i++)
            for(int j=sum;j>=w[i];j--)
                f[j]=max(f[j],f[j-w[i]]+v[i]);
        int ans=val-f[sum-1];
        printf("%d
",ans);
    }
}
 
 
 
 
原文地址:https://www.cnblogs.com/balfish/p/4015278.html