完全背包
有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。输入格式
第一行两个整数,N,V,,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行两个整数 vi,wi,,用空格隔开,分别表示第 i 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1100;
int n,v;
int v1[N];
int w[N];int f[N];int main()
{cin >> n>>v;for (int i = 1; i <= n; i ++ ){cin>>v1[i];cin>>w[i];}for(int i=1;i<=n;i++){for(int j=v1[i];j<=v;j++){f[j] = max(f[j],f[j-v1[i]]+w[i]);}}cout<<f[v];
}
518. 零钱兑换 II
class Solution {
public:int change(int amount, vector<int>& coins) {vector<int> f(amount+1,0);f[0]=1;for(int i=0;i<coins.size();i++){for(int j=coins[i];j<=amount;j++){f[j]+=f[j-coins[i]];}}return f[amount];}
};
377. 组合总和 Ⅳ
//回溯法,但超时
class Solution {
public:int count;int sum;int combinationSum4(vector<int>& nums, int target) {backtracking(nums,target);return count;}void backtracking(vector<int> &nums,int target){if(sum==target){count++;return;}if(sum>target){return;}for(int i=0;i<nums.size();i++){sum+=nums[i];backtracking(nums,target);sum-=nums[i];}}
};
class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<int> f(target+1,0);f[0]=1;for(int j = 0;j<=target;j++){for(int i=0;i<nums.size();i++){if(j-nums[i]>=0 && f[j] < INT_MAX - f[j - nums[i]])f[j]+=f[j-nums[i]];}}return f[target];}
};